带有表变量的TSQL Scope

时间:2013-02-13 16:52:39

标签: tsql sql-server-2008-r2 transactionscope sqltransaction

我有一个表列表,其中一些表有Employee_ID列。至少有一个表缺少至少一个Employee_ID。我想在其他表中找不到Employee_ID。

我运行以下命令,但在@temp_employees上得到一个“必须声明标量变量”错误。我相信范围是正确的。

如何在保留其范围的同时在TSQL中使用表变量@temp_employees,以便将其用于整个循环?

注意:该软件有许多版本,并且多年来有许多表结构更改。我不想为每个表结构更改编写特定于版本的脚本,因为缺少的Employee_ID始终是软件中错误的来源。

/***************************************************************
*  Find missing employee id's regardless of software version   *
***************************************************************/
USE [database name]

DECLARE @i AS INT,
        @iMAX AS INT,
        @SQL AS nvarchar(MAX),
        @table AS nvarchar(MAX)

DECLARE @temp_tables TABLE (
    id int identity(1,1),
    table_name nvarchar(MAX) NULL
)       

DECLARE @temp_employees TABLE (
    id int identity(1,1),
    employee_id int NOT NULL,
    table_name nvarchar(255) NULL
)

INSERT @temp_tables (table_name) SELECT t.name FROM sys.tables t 
    INNER JOIN sys.columns c ON t.object_id = c.object_id WHERE c.name = 'employee_id'
SELECT * FROM @temp_tables

SELECT @i = MIN(id) FROM @temp_tables
SELECT @iMAX = MAX(id) FROM @temp_tables

WHILE (@i < @iMAX)
BEGIN
    SELECT @table = table_name FROM @temp_tables WHERE id = @i

    SELECT @SQL = N'INSERT ' + @temp_employees + ' (employee_id, table_name) SELECT employee_id, ''' + @table + ''' FROM ' + @table + ' WHERE employee_id NOT IN (SELECT employee_id FROM ' + @temp_employees + ')'
    EXEC sp_executeSql @SQL

SET @i = @i + 1
END

SELECT * FROM @temp_employees

2 个答案:

答案 0 :(得分:1)

当您使用sp_executesql时,它将在与脚本其余部分不同的范围内执行。我有一篇关于here的简短博客文章。

答案 1 :(得分:1)

...SELECT @SQL = N'INSERT ' + @temp_employees + '...

您正在将nvarchar与表变量混合使用。这就是您收到此错误的原因&#34;必须声明标量变量&#34;

我认为你应该创建一个持久表

...
DECLARE temp_employees TABLE (
    id int identity(1,1),
    employee_id int NOT NULL,
    table_name nvarchar(255) NULL
)
...
    SELECT @SQL = N'INSERT temp_employees (employee_id, table_name)
...