1

我有以下代码片段:

   DECLARE @uidSecurity NVARCHAR(25), 
        @sql NVARCHAR(500), 
        @DBName nvarchar(50)= 'DBNAME', 
        @SecurityGroup nvarchar(10) = 'NEWGROUP'

   declare @Winlogon table (
    uidFileNumber nvarchar(25))

   select @sql = ' INSERT INTO @Winlogon
        SELECT uidFileNumber 
        FROM [' + @DBName + '].dbo.SERCURE 
        WHERE code = ''' + @SecurityGroup + ''''

   exec sp_executesql @sql

   SELECT uidFileNumber FROM @WINLOGON

我正在尝试使用来自另一个数据库的数据填充一个局部变量,该数据将随着代码的每个循环而改变。我的问题是它无法识别@winlogon 表变量在@SQL 语句中被声明。还有另一种方法可以做到这一点吗?

如果我将静态数据库名称传递到代码中,它可以工作,如下所示:

 DECLARE @uidSecurity NVARCHAR(25), 
   @sql NVARCHAR(500), 
   @sql1 NVARCHAR(500), 
   @SecurityGroup nvarchar(10) = 'NEWGROUP'

   declare @Winlogon table (
    uidFileNumber nvarchar(25))

   INSERT INTO @Winlogon
   SELECT uidFileNumber 
   FROM [STATICDB].dbo.SERCURE 
   WHERE code = @SecurityGroup

   SELECT uidFileNumber FROM @WINLOGON

但是每次代码使用 while 循环运行时,我都需要通过另一个局部变量传递不同的数据库名称。

4

1 回答 1

0

您可以使用 INSERT-EXEC:

 DECLARE @uidSecurity NVARCHAR(25), 
     @sql NVARCHAR(500), 
     @sql1 NVARCHAR(500), 
     @SecurityGroup nvarchar(10) = 'NEWGROUP'

 DECLARE @Winlogon TABLE (
     uidFileNumber nvarchar(25))

 SET @sql = N'SELECT uidFileNumber 
    FROM ' + QUOTENAME(@DBName) + '.dbo.SERCURE 
    WHERE code = ' + QUOTENAME(@SecurityGroup, '''')

 INSERT INTO @Winlogon(uidFileNumber)
 EXEC(@sql)
于 2013-09-26T00:10:52.840 回答