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

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

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

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

销售区域的文档:

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

销售人员的文档:

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

文档中的数据来自AdventureWorks

代码语言:javascript
代码运行次数:0
运行
复制
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 17:00:38

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

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

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

https://stackoverflow.com/questions/64964518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档