简体   繁体   中英

sp_executesql not executing dynamic sql

I want to get the value of two variables from dynamic sql .

declare @sImport_Table1 table 
 (
   Id int identity(1,1) ,
   Zone nvarchar(50),
   Sub_Code nvarchar(50),
   Geography nvarchar(50),
   DayOfWeek nvarchar(50)
 )



INSERT INTO @sImport_Table1 SELECT 'A','Z','Geo','SUN'

declare @sZone nvarchar(50)
declare @sSubCode nvarchar(50)
declare @c_Geography nvarchar(50)='Geo'
declare @c_DayOfWeek nvarchar(50)='SUN'
declare @sImport_Table nvarchar(500)='@sImport_Table1'



--SELECT * FROM @sImport_Table1
declare @sQuery nvarchar(4000) 

SET @sQuery='SELECT @sZone = Zone, '+
                   '@sSubCode = Sub_Code
          FROM '+ @sImport_Table +
         ' WHERE Geography ='''+ @c_Geography + '''
          AND [DayOfWeek] = '''+ @c_DayOfWeek +''''

PRINT @sQuery 

sp_executesql @sQuery)

PRINT @sZone 
PRINT @sSubCode    

You will need to declare this table variable inside the Dynamic sql as dynamic sql has its own scope, variable declared outside of dynamic sql are not visible inside dynamic sql.

And also use OUTPUT clause when trying to retrieve values from a dynamic sql query. Something like this....

declare @sZone nvarchar(50)
declare @sSubCode nvarchar(50)
declare @c_Geography nvarchar(50)='Geo'
declare @c_DayOfWeek nvarchar(50)='SUN'
declare @sImport_Table nvarchar(500)='@sImport_Table1'



--SELECT * FROM @sImport_Table1
declare @sQuery nvarchar(MAX); --<-- to be on safe side 

SET @sQuery = N' declare @sImport_Table1 table 
                     (
                       Id int identity(1,1) ,
                       Zone nvarchar(50),
                       Sub_Code nvarchar(50),
                       Geography nvarchar(50),
                       DayOfWeek nvarchar(50)
                     )
               INSERT INTO @sImport_Table1 SELECT ''A'',''Z'',''Geo'',''SUN''

               SELECT @sZone = Zone, @sSubCode = Sub_Code ' +
              N' FROM @sImport_Table1 ' + 
              N' WHERE Geography =  @c_Geography  ' +
              N' AND [DayOfWeek] =  @c_DayOfWeek '

PRINT @sQuery 

EXECUTE sp_executesql @sQuery
                     ,N'@c_Geography nvarchar(50),@c_DayOfWeek nvarchar(50),
                        @sZone nvarchar(50) OUTPUT, @sSubCode nvarchar(50) OUTPUT'
                     ,@c_Geography , @c_DayOfWeek, @sZone OUTPUT, @sSubCode OUTPUT
SELECT @sSubCode, @sZone

Replace sp_executesql @sQuery)

with

execute sp_executesql @sQuery

Also in dynamic queries you need to declare variables inside your dynamic string. Otherwise it will throw error.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM