SQL尝试使用变量提供日志

时间:2016-06-03 14:24:40

标签: sql sql-server

所以我正在使用MS SQL,我正在尝试设置我的语句,以便在执行代码时可以轻松打印日志。出于某种原因,我的变量似乎超出了范围,我无法确定原因。

收到错误:Must declare the scalar variable "@Ideas"

什么有用的片段(又名不打印):

DECLARE @Ideas TABLE(IdeaID int) 
INSERT INTO @Ideas (IdeaID) 
    SELECT IdeaID FROM dbo.Ideas 
    WHERE IdeaID IN (5,6,7) 
DELETE FROM dbo.TableA WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)
DELETE FROM dbo.TableB WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)
DELETE FROM dbo.TableC WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)

然后从各种表继续删除,但总是使用相同的ID数组...我尝试提供打印交易的方法:

DECLARE @PopulateIdeas varchar(500)
DECLARE @Ideas TABLE(IdeaID int)
SET @PopulateIdeas = 
    '
    INSERT INTO' + @Ideas + '(IdeaID) 
    SELECT [IdeaID] 
    FROM [dbo].[Ideas]
    WHERE [IdeaID] IN (5,6,7,8) 
    '
PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)

此时我甚至没有尝试设置删除,因为我被困在填充临时表并打印出来......所有帮助/建议都很受欢迎。

2 个答案:

答案 0 :(得分:0)

您遇到的问题是本地变量@ideas的范围,因为执行调用函数sp_executesql

要解决此问题,您必须在字符串中移动declare语句。

这是一个很好的模式,但要做到这一点,您只需将代码更改为:

DECLARE @PopulateIdeas varchar(500)

SET @PopulateIdeas = 
    'DECLARE @Ideas TABLE(IdeaID int);

    INSERT INTO @Ideas(IdeaID) 
    SELECT [IdeaID] 
    FROM [dbo].[Ideas]
    WHERE [IdeaID] IN (5,6,7,8) 
    '
PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)

答案 1 :(得分:0)

正如其他人所说,这是一个范围问题。一个解决方法是使用" #temp"表格如下。它不是一个理想的解决方案,特别是如果涉及到大量数据,但对于小型集合,它应该没问题。

DECLARE @PopulateIdeas varchar(500)

CREATE TABLE #Ideas (IdeaID int)

SET @PopulateIdeas = 
    '
    INSERT INTO #Ideas (IdeaID) 
    SELECT IdeaID
    FROM dbo.Ideas
    WHERE IdeaID IN (5,6,7,8) 
    '

PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)