Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何编写一个包含动态SQL代码的SQL服务器端模块(存储过程)来创建文档?

如何编写一个包含动态SQL代码的SQL服务器端模块(存储过程)来创建文档?
EN

Stack Overflow用户
提问于 2020-11-23 08:01:33
回答 1查看 127关注 0票数 0

我已经编写了一个包含动态SQL的存储过程来创建指定格式的文档。文档是针对销售区域还是针对销售人员,将在运行时确定,因为它是动态SQL。

销售区域的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"TerritoryID":1,"TotalYearlySales":[2620944,5325813,6759501,3355403]},  
{"TerritoryID":2,"TotalYearlySales":[705672,3272240,2965567,876731]} 

销售人员的文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{"SalesPersonID":274, "TotalYearlySales":[32568,516197,485881,201289]},     
{"SalesPersonID":275, "TotalYearlySales":[986298,3806298,4490942,1191828]}    

文档中的数据来自AdventureWorks

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
create procedure dbo.TotalYearlySales
    @id nvarchar(30)
as
begin
    set @id = cast (@id as varchar(30))
    SELECT DISTINCT @id,
            JSON_QUERY('[' +
                STUFF(
                    (SELECT ',', rtrim(cast(SUM(TotalDue) as int))
                     FROM Sales.SalesOrderHeader SOH2
                     WHERE SOH1.@id = SOH2.@id 
                     AND SOH2.@id is not null
                     GROUP BY YEAR(SOH2.OrderDate)
                     ORDER BY YEAR(SOH2.OrderDate)
                     FOR XML PATH(''))
                , 1, 1, '')
            + ']') as TotalYearlySales
    from Sales.SalesOrderHeader SOH1
    GROUP BY cast (@id as varchar(30))
    ORDER BY cast (@id as varchar(30))
    FOR JSON AUTO;
end



    
declare @MyInput varchar(20);
set @MyInput= 'TerritoryID';
exec dbo.TotalYearlySales @MyInput;

此SP不工作,因为我无法传递@id,我在'@id‘附近收到错误语法错误。请告诉我如何使用动态SQL语句编写存储过程。

我正在使用SQL Server 2019

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-23 09:00:38

如果我理解正确的话,您需要为不同的分组标准(TerritoryIDSalesPersonID)构建并执行一条动态语句。

根据问题中的尝试,一种可能的方法是以下存储过程。请注意,从SQL Server 2017开始,您可以使用STRING_AGG() (而不是FOR XML PATH)进行字符串聚合:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CREATE PROCEDURE dbo.TotalYearlySales
   @id sysname
AS
BEGIN
   DECLARE @stm nvarchar(max)
   DECLARE @err int
   
   -- Dynamic statement
   SET @stm = 
      N'SELECT t.' + QUOTENAME(@id) + N', CONCAT(''['', STRING_AGG(t.TotalDue, '',''), '']'') AS TotalYearlySales ' +
      N'FROM ( ' +
         N'SELECT ' + QUOTENAME(@id) + N', CONVERT(int, SUM(TotalDue)) AS TotalDue ' +
         N'FROM Sales.SalesOrderHeader ' +
         N'WHERE ' + QUOTENAME(@id) + N' IS NOT NULL ' +
         N'GROUP BY ' + QUOTENAME(@id) + N', YEAR(OrderDate) ' +
      N') t ' +
      N'GROUP BY t.' + QUOTENAME(@id) + N' ' +
      N'FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER'

   -- Statement execution
   EXEC @err = sp_executesql @stm, N' @id sysname', @id
   IF @err <> 0 BEGIN
      PRINT 'Error' 
   END
END

执行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DECLARE @MyInput sysname
SET @MyInput = N'TerritoryID';
EXEC dbo.TotalYearlySales @MyInput
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64964518

复制
相关文章
使用SQL语句创建存储过程
优点: 1、方便修改。   因为存储过程是存储在数据库中的,如果需要涉及到修改SQL语句,那么数据库专业人员只需要去修改数据库中的存储过程就可以,对程序毫无影响,如果用SQL语句的话,SQL语句是写在程序中的,如果涉及到修改SQL语句,那么就需要去修改源程序。
初阶牛
2023/10/14
4100
使用SQL语句创建存储过程
mysql存储过程实例_sql存储过程创建实例详解
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
全栈程序员站长
2022/09/27
2.3K0
SQL存储过程
什么是存储过程? 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。
小语雀网
2021/09/08
8950
SQL存储过程
存储过程 什么是存储过程 创建调用与删除 变量声明 参数定义 流程语句 查看存储过程 什么是存储过程 创建一组为了完成特定功能的SQL语句集 之后需要用到时就可以直接用存储过程名使用 创建的存储过程保存在数据库的数据字典中 创建调用与删除 /* 创建 */ DELIMITER $$ CREATE PROCEDURE 名称() BEGIN 语句 END $$ DELIMITER ; /* 调用 */ call 名称(); /* 删除 */ drop procedure 名称; DELIMITER语句将标
木瓜煲鸡脚
2019/08/06
1.2K0
sql 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
格姗知识圈
2019/07/19
1.4K0
sql存储过程简单例题_sql存储过程实例详解
2、创建存储过程P2,查询学生的学号、姓名、课程名、成绩,将学生所在系作为输入参数
全栈程序员站长
2022/09/27
9030
SQL Server 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念     存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。     存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。     由于存储过程在创建时即在数据
牛嗷嗷
2018/03/30
1.8K0
SQL Server 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。
冰封一夏
2019/09/11
1.4K0
sql server存储过程
存储过程、函数区别 函数可以在sql语句中调用,存储过程不行 函数只能返回一个返回值,存储过程可以返回多个 存储过程 无参数的存储过程 create proc usp_helloworld as begin print 'Hello World' end 有参数的存储过程 create proc usp_book @name nvarchar(50), @author nvarchar(50) as begin select * from book where name=@name and
sofu456
2020/04/30
1.2K0
SQL 存储过程分页
CREATE PROC p_Team_GetTemaList @pageindex INT , @pagesize INT , @keywords VARCHAR(200) , --模糊查询 名称 标签 @citycode VARCHAR(100) , @verifyStatus INT =0,-- -1所有的 0 没有通过 1 审核通过 @orderby INT, @TotalCount INT OUTPUT AS BEGIN
纯粹是糖
2018/03/14
1.5K0
SQL Server 存储过程
Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用。当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句。这样就可以提高存储过程的性能。 Ø 存储过程的概念     存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。     存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。     由于存储过程在创建时即在数据
hbbliyong
2018/03/05
1.8K0
SQL Server 存储过程_mysql存储过程教程
**相对于视图的优势(为什么使用存储过程):** Sql Server中视图通过简单的Select查询来解决多次复杂的查询,但是视图不能提供业务逻辑的功能,而存储过程可以。 **什么是存储过程:**
全栈程序员站长
2022/11/14
5.5K0
MS SQL 的存储过程练习
/*带参存储过程 if(OBJECT_ID('proc_find_stu', 'p') is not null)    drop proc proc_find_stu go create proc proc_find_stu(@startId int, @endId int) as    select * from student where stu_id between @startId and @endId go*/ /*调用存储过程 exec proc_find_stu 7, 9*/ --带通配符参数存储过程 /*if(OBJECT_ID('proc_findStudentByName','P') is not null)    drop proc proc_findStudentByName go create proc proc_findStudentByName(@name varchar(20) = '%j%', @nextName varchar(20) = '%') as    select * from student where stu_name like @name and stu_name like @nextName; go*/ --执行存储过程 /*exec proc_findStudentByName; exec proc_findStudentByName '%o%','t%';*/ --带输出参数存储过程 /*if(OBJECT_ID('proc_getStudentRecord','P') is not null)    drop proc proc_getStudentRecord go create proc proc_getStudentRecord(    @id int,--默认输入参数    @name varchar(20) out, -- 输出参数    @age varchar(20) output -- 输入输出参数 ) as    select @name = stu_name, @age = stu_age from student where stu_id = @id and stu_age = @age; go*/ -- /*declare @id int,         @name varchar(20), @temp varchar(20); set @id = 9; set @temp = 40; exec proc_getStudentRecord @id,@name out,@temp output; select @name, @temp print @name + '#' + @temp;*/ --不缓存存储过程 --WITH RECOMPILE 不缓存 /*if (OBJECT_ID('proc_temp','P') is not null)    drop proc proc_temp go create proc proc_temp with recompile as     select * from student; go*/ --exec proc_temp; --加密WITH ENCRYPTION /*if (OBJECT_ID('proc_temp_encryption','P')is not null)    drop proc proc_temp_ecryption go create proc proc_temp_encryption with encryption as    select * from student; go*/ /*exec proc_temp_encryption; exec sp_helptext 'proc_temp'; exec sp_helptext 'proc_temp_encryption';*/ --带游标参数存储过程 /*if(OBJECT_ID('proc_cursor','P') is not null)    drop proc proc_cursor go create proc proc_cursor    @cur cursor varying output as    set @cur = cursor forward_only static for    select stu_id, stu_name, stu_age from student;    open @cur; go*/ --调用 /*declare @exec_cur cursor; declare @id int,         @name varchar(20), @age int; exec proc_curs
静谧的小码农
2019/01/11
9590
sql常用的系统存储过程
常用的系统存储过程 sp_databases 列出服务上的所有数据库 sp_helpdb 报告有关指定数据库或所有数据库的信息 sp_renamedb 更改数据库的名称 sp_tables 返回当前环境下可查询的对象的列表 sp_columns 返回某个表列的信息 sp_help 返回某个表的所有信息 sp_helpconstraint 查看某个表的约束 sp_helpindex 查看某个表的索引 sp_stored_procedures 列出当前环境中的所有存储过程 sp_passwo
lpxxn
2018/01/31
1K0
3. SQL -- 存储过程
在Sql Server中,可以定义子程序存放在数据库中,这样的子程序称为存储过程,它是数据库对象之一.
py3study
2020/01/14
1.1K0
sql 2008 分页存储过程
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- [SelectBase] 1,1,'Users','username=''test''' ALTER procedure [dbo].[SelectBase] @PageIndex int, @PageSize int, @TableName nvarchar(max), @Where
javascript.shop
2019/09/04
1.1K0
sql server存储过程编程
存储过程是一组完成特定功能的SQL 语句集合,经编译后存储在数据库中。 存储过程作为一个单元进行处理并以一个名称来标识。它能向用户返回数据、向数据库表中写入或修改数据等操作。 用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。 存储过程的作用 执行速度快; 减少网络流量; 作为一种安全机制。通过设置用户只可能使用存储过程访问数据,限制用户不能直接操作数据库中的敏感数据,以保障数据的安全性; 屏蔽T-SQL命令,提供交互查询的客户接口,增加数据库应用的方便性。 存储过程和函数的异同 本质
欠扁的小篮子
2018/04/09
2.1K0
Sql Server 调用存储过程
创建存储过程: 1、在企业管理器中新建存储过程 2、在查询分析器中编辑存储过程(带有参数和返回值的) SET  QUOTED_IDENTIFIER  ON     GO   SET  ANSI_NULLS  ON     GO     ALTER      procedure  insertUserinfo  @name   varchar ( 50 ), @sex   varchar ( 50 ), @birthday   varchar ( 50 ), @returnValue   int   =   
西门呀在吹雪
2020/11/09
1.8K0
SQL存储过程之更新[通俗易懂]
—添加存储过程 USE TestDB GO if OBJECT_ID(‘UpdataStudent’,‘P’)IS NOT NULL Drop Procedure UpdataStudent go Create Procedure UpdataStudent @SN0 INT, @SName CHAR(10), @Gender CHAR(2), @Birthday DATETIME, @Mobile CHAR(20), @Email CHAR(100), @HomeAddress CHAR(100), @PhotoPath CHAR(100) AS Update Student Set SName=@SName,Gender=@Gender,Birthday=@Birthday,Mobile=@Mobile,Email=@Email,HomeAddress=@HomeAddress,PhotoPath=@PhotoPath where SNO=@SN0 go
全栈程序员站长
2022/11/07
1K0
Sql Server 存储过程分页
  在企业级项目开发中,分页查询,获取某一类数据的List列表,这一功能是最普遍也是最重要的功能。其做法有很多种,例如ORM中自定义分页查询,一般情况下是拼接强类型的查询条件,然后转换成sql语句,查出出分页结果。在ORM转换过程中会稍微损失性能,效率会降低。对于百万级以上的大数据量,要求查询界面显示速度快,此时手动写存储过程,并且在存储过程中分页是最佳选择。下面给出具体的示例与说明:
张传宁IT讲堂
2019/09/17
1.5K0

相似问题

如何编写T-SQL存储过程来创建主键?

10

使用动态SQL编写存储过程

120

SQL动态创建存储过程?

33

如何识别包含动态sql的存储过程

10

从动态sql创建存储过程的存储过程

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文