2015-03-13 74 views
0

我有一个问题,我真的不知道如何解决。使用多个变量执行T-SQL命令

我有一个查询,基本上是做一个循环,执行命令。而且我的结果会以空白形式返回,其中声明基本上会有一组空白数据。

I.E.我收到了按预期方式返回的多个结果集,并返回了一大堆没有数据的结果集。

请给我一只手,我真的完全迷失了,它把我逼疯了。

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 

--Edited--

对不起,我现在干的循环,因为它会生成具有集团和客户区域的可能组合的文件输出。

因此,我将在此实例中使用10个不同的文件,每个文件都有不同于Group和Customer Region的数据。

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

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

+2

首先你错过了执行中的WHERE语句 – Galma88 2015-03-13 14:17:13

+1

总是一个好主意,首先''打印'你的动态查询,看看你将实际运行什么..用'PRINT'替换'EXEC'并确认你的SQL做你期望的事情。 – AHiggins 2015-03-13 14:21:11

+2

你为什么要这样做循环?这可以很容易地写出来,并且作为一个适当的基于查询的集合更加理智。 – 2015-03-13 14:22:41

回答

0

您需要在光标中包含您的位置标准。 “[Customer Region]!=''1''”位于光标内部。当您发生客户区域为1的记录时,您会看到空白。

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') 
+0

抱歉Blam,我忘了添加循环的原因。它将根据独特的组合生成多个文件。 – Digi 2015-03-13 15:10:21

+0

然后在问题中明确。即使如此,在游标中获取你的值,而不是重新查询循环内的数据。你需要说明你想要做什么,因为我怀疑你没有采取最佳方法, – Paparazzi 2015-03-13 15:57:55

0

好的,谢谢你,你的信息帮助我。定义光标处的位置似乎可以正确得到我需要的一切。

我在两种情况下都拉到了这里,所以我得到了我想要的各种输出,正确地做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输出:)

感谢您的帮助球员们。