0

テーブルのリストがあり、そのうちのいくつかには列 Employee_ID があります。少なくとも 1 つのテーブルで、少なくとも 1 つの Employee_ID が欠落しています。他のテーブルから欠落している Employee_ID を見つけたいです。

以下を実行しましたが、@temp_employees で「スカラー変数を宣言する必要があります」というエラーが表示されます。範囲は正しいと思います。

テーブル変数 @temp_employees を TSQL 内でスコープを維持しながら使用し、ループ全体で使用するにはどうすればよいですか?

注: ソフトウェアには多くのバージョンがあり、何年にもわたって多くのテーブル構造が変更されています。欠落している 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
4

2 に答える 2

1

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

nvarchar とテーブル変数を混在させています。そのため、「スカラー変数を宣言する必要があります」というエラーが表示されます

永続的なテーブルを作成する必要があると思います

...
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)
...
于 2013-02-13T17:40:26.353 に答える