执行带有多个变量的 T-SQL 命令
Executing T-SQL Command with Multiple Variables
我遇到了一个问题,老实说我不知道如何解决。
我有一个基本上是循环的查询,带有执行命令。我的结果返回的是空白,语句基本上会有一组空白数据。
即我按预期返回了多个结果集,并且返回了一大堆,其中没有数据。
请帮帮我,我真的完全迷路了,这让我发疯。
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。我们有一个新组加入,我们将生成另一个报告,其中包含其独特的数据。
希望这对您有所帮助,对于之前含糊不清的解释,我们深表歉意。
是的,你完全迷路了
- 永远不要使用 SET @BRANCH = N'Patleys'
- 没有地方
- 遍历每个值并根据值进行分组 - 不需要
一个循环
一个 select - 无循环 - 无光标
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')
您需要在光标中包含您的位置条件。 “[Customer Region] != ''1''”在光标所在的select内。当您偶然发现客户区域为 1 的记录时,您会得到空白。
好的谢谢威尔,你的信息对我有帮助。在我的光标中定义 Where 似乎可以正确获得我需要的一切。
我在两种情况下都选择了 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 输出:)
感谢小伙伴们的帮助。
我遇到了一个问题,老实说我不知道如何解决。
我有一个基本上是循环的查询,带有执行命令。我的结果返回的是空白,语句基本上会有一组空白数据。
即我按预期返回了多个结果集,并且返回了一大堆,其中没有数据。
请帮帮我,我真的完全迷路了,这让我发疯。
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。我们有一个新组加入,我们将生成另一个报告,其中包含其独特的数据。
希望这对您有所帮助,对于之前含糊不清的解释,我们深表歉意。
是的,你完全迷路了
- 永远不要使用 SET @BRANCH = N'Patleys'
- 没有地方
- 遍历每个值并根据值进行分组 - 不需要 一个循环
一个 select - 无循环 - 无光标
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')
您需要在光标中包含您的位置条件。 “[Customer Region] != ''1''”在光标所在的select内。当您偶然发现客户区域为 1 的记录时,您会得到空白。
好的谢谢威尔,你的信息对我有帮助。在我的光标中定义 Where 似乎可以正确获得我需要的一切。
我在两种情况下都选择了 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 输出:)
感谢小伙伴们的帮助。