使用多个变量执行T-SQL命令

时间:2015-03-13 14:14:40

标签: sql-server tsql loops execute

我遇到了一个问题我真的不知道如何解决。

我有一个基本上使用执行命令执行循环的查询。我的结果将以空格返回,其中语句基本上会有一组空白数据。

即。我得到了多个按预期返回的结果集,并返回了一大堆没有数据的结果集。

请帮我一把,我真的完全迷失了,它让我在这里疯了。

DECLARE @CustomerRegion NVARCHAR(30)
DECLARE @Groups NVARCHAR(30)
DECLARE @BRANCH NVARCHAR(7)
DECLARE @getid CURSOR

SET @BRANCH = N'Patleys'

SET @getid = CURSOR FOR
   SELECT   
       [Main_Reporting].[dbo].[Sales].[Customer Region],
       [Main_Reporting].[dbo].[Sales].[Groups]
   FROM 
       [Main_Reporting].[dbo].[Sales]

OPEN @getid

FETCH NEXT FROM @getid INTO @CustomerRegion, @Groups

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('SELECT [Branch]
                  ,[cust-number]
                  ,[Customer Region]
                  ,[Groups]
           FROM [Main_Reporting].[dbo].[Sales]
           WHERE      -- Missed     
               [Customer Region] != ''1''
               AND [Customer Region] = ''' + @CustomerRegion + '''
               AND [Groups] = ''' + @Groups + '''
           GROUP BY 
               [Branch], [cust-number]
               , [Customer Region], [Groups]
           ORDER BY 
               MAX([invoice-date]) DESC')

    FETCH NEXT FROM @getid INTO @CustomerRegion, @Groups
END

CLOSE @getid
DEALLOCATE @getid

- 编辑 -

抱歉,我正在进行循环,因为它将使用组和客户区域的可能组合生成文件输出。

因此,在这个例子中,我将拥有10个不同的文件,每个文件都包含对于组和客户区域不同的数据。

不是生成几个脚本,而是每个循环都会运行,然后输出到文件并移动到下一个文件。这种方式我认为如果我添加任何新的东西会更好,E.I。我们有一个新的组加入,我们将生成另一个报告,其中包含其唯一数据。

希望这会有所帮助,对于早先模糊的探索感到抱歉。

3 个答案:

答案 0 :(得分:0)

是的,你完全迷失了

  • 不要使用SET @BRANCH = N' Patleys'
  • 没有地方
  • 遍历每个值并在值上有一个组 - 不需要 一个循环

一个选择 - 没有循环 - 没有光标

SELECT [Branch], [cust-number], [Customer Region], [Groups]
FROM   [Main_Reporting].[dbo].[Sales]
where  [Customer Region] != '1'
GROUP BY [Branch], [cust-number], [Customer Region], [Groups]
ORDER BY MAX([invoice-date]) DESC')

答案 1 :(得分:0)

您需要在光标中包含where条件。 " [客户区域]!='' 1''"在光标内部的选择中。当您发现客户区域为1的记录时,您会得到空白。

答案 2 :(得分:0)

好的,谢谢你,你的信息帮助了我。定义我的光标中的位置似乎可以正确获取我需要的所有内容。

我在两种情况下拉出了Where,所以当你分别做2或3时,我得到了我想要的各种输出。

所以基本上我的脚本现在就是这样。

DECLARE @CustomerRegion NVARCHAR(30)
DECLARE @Groups NVARCHAR(30)
DECLARE @BRANCH NVARCHAR(7)
DECLARE @getid CURSOR

SET @getid = CURSOR FOR
   SELECT   
       [Main_Reporting].[dbo].[Sales].[Customer Region],
       [Main_Reporting].[dbo].[Sales].[Groups]
   FROM 
       [Main_Reporting].[dbo].[Sales]
WHERE   [Customer Region] != ''1''

OPEN @getid

FETCH NEXT FROM @getid INTO @CustomerRegion, @Groups

WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC ('SELECT [Branch]
                  ,[cust-number]
                  ,[Customer Region]
                  ,[Groups]
           FROM [Main_Reporting].[dbo].[Sales]
           WHERE   [Customer Region] != ''1''
               AND [Customer Region] = ''' + @CustomerRegion + '''
               AND [Groups] = ''' + @Groups + '''
           GROUP BY 
               [Branch], [cust-number]
               , [Customer Region], [Groups]
           ORDER BY 
               MAX([invoice-date]) DESC')

    FETCH NEXT FROM @getid INTO @CustomerRegion, @Groups
END

CLOSE @getid
DEALLOCATE @getid

现在只需处理多个XLS输出:)

感谢帮助男女。