2016-11-17 61 views
0

如果服务器中的所有数据库的特定表值都需要打印。我想这下面的错误必须声明标量变量“@lookupname”

消息137,15级,状态1,行
必须声明标量变量 “@lookupname”。

有人可以告诉我我犯的错吗?

declare @name varchar(50); 
declare Countofprovider cursor 
    for 
SELECT name 
FROM master.dbo.sysdatabases where name like '%CPM_%' 
    open Countofprovider 
     fetch next from Countofprovider into @name; 
      while @@FETCH_STATUS = 0 
       begin 
        --print 'Name : '+ @name+ '' 
        declare @sql varchar(MAX);    
        declare @lookupname varchar(100); 
        declare @lookupvalue varchar(100); 
        --------------------------- 
        SET @sql = 'select @lookupname=lookupname,@lookupvalue=lookupvalue from [AUS-CPMLDGDB01].'[email protected]+'.cpm.ApplicationLookup where lookupname = ''IsPCPLeakageEnabled'' and lookupvalue = ''TRUE''' 
        print 'Name : '+ @name+ ', lookupname : '+ @lookupname+ ', Loolupvalue : '[email protected]+'' 
        exec (@SQL) 
        --------------------------- 
     fetch next from Countofprovider into @name 
    end 
CLOSE Countofprovider; 
DEALLOCATE Countofprovider; 
+0

其工作的SQL服务器上。 –

+0

@ Mr.Bhosale不,它不会,它似乎工作,因为你没有一个类似'%CPM _%'这样的名字的数据库,所以'@@ FETCH_STATUS'永远不会有值'0',并且while中的代码永远不会执行。 – HoneyBadger

+0

我在下面添加了工作代码。核实 –

回答

0

由于您在动态SQL查询中使用外部变量,因此必须将此变量显式传递到动态SQL执行中。

因此改变

exec(@SQL) 

exec sp_executesql 
    @sql, 
    N'@lookupname varchar(100) out, @lookupvalue varchar(100) out', 
    @lookupname out, 
    @lookupvalue out 
0

您的查询中使用参数:

exec sp_executesql @sql, N'@lookupname varchar(100) OUT, @lookupvalue varchar(100) OUT', @lookupname = @lookupname OUT, @lookupvalue = @lookupvalue OUT 
0

试试下面的代码。

  declare @name varchar(50); 
      declare Countofprovider cursor 
       for 
      SELECT name 
      FROM master.dbo.sysdatabases where name like '%CPM_%' 
       open Countofprovider 
        fetch next from Countofprovider into @name; 
         while @@FETCH_STATUS = 0 
          begin 
           --print 'Name : '+ @name+ '' 
           declare @sql nvarchar(MAX);    
           declare @lookupname varchar(100); 
           declare @lookupvalue varchar(100); 
           --------------------------- 
           SET @sql = 'select @lookupname=lookupname,@lookupvalue=lookupvalue from [AUS-CPMLDGDB01].'[email protected]name+'.cpm.ApplicationLookup where lookupname = ''IsPCPLeakageEnabled'' and lookupvalue = ''TRUE''' 
           print 'Name : '+ @name+ ', lookupname : '+ @lookupname+ ', Loolupvalue : '[email protected]+'' 
           exec sp_executesql @sql, N'@lookupname varchar(100) OUT, @lookupvalue varchar(100) OUT', @lookupname = @lookupname OUT, @lookupvalue = @lookupvalue OUT 

           --------------------------- 
        fetch next from Countofprovider into @name 
       end 
      CLOSE Countofprovider; 
      DEALLOCATE Countofprovider; 
1

在你的PL做了一些修改

declare @name varchar(50); 
declare Countofprovider cursor 
    for 
SELECT name 
FROM master.dbo.sysdatabases where name like '%t%' 
    open Countofprovider 
     fetch next from Countofprovider into @name; 
      while @@FETCH_STATUS = 0 
       begin 
        --print 'Name : '+ @name+ '' 
        declare @sql nvarchar(MAX);    
        declare @lookupname varchar(100); 
        declare @lookupvalue varchar(100); 
        --------------------------- 
        SET @sql = 'select @lookupname=lookupname,@lookupvalue=lookupvalue from [AUS-CPMLDGDB01].'[email protected]+'.cpm.ApplicationLookup where lookupname = ''IsPCPLeakageEnabled'' and lookupvalue = ''TRUE''' 

        exec sp_executesql 
        @sql, 
        N'@lookupname varchar(100) out, @lookupvalue varchar(100) out', 
        @lookupname out, 
        @lookupvalue out 

        print 'Name : '+ @name+ ', lookupname : '+ @lookupname+ ', Loolupvalue : '[email protected]+'' 

        --------------------------- 
     fetch next from Countofprovider into @name 
    end 
CLOSE Countofprovider; 
DEALLOCATE Countofprovider; 

动态查询必须存储在nvarchar的可变

declare @sql nvarchar(MAX); 

exec sp_executesql 
        @sql, 
        N'@lookupname varchar(100) out, @lookupvalue varchar(100) out', 
        @lookupname out, 
        @lookupvalue out