Próbuję użyć dynamicznego SQL podczas ustawiania wartości zmiennej, ale to nie działa. Jednak ta sama instrukcja działa w zwykłym języku SQL. To jest kod:

DECLARE @sqlcmd nchar(1024);
DECLARE @DBName nchar(30) = 'DB_1016a'
DECLARE @UserKey int = 0;
DECLARE @UserID nchar(30) = 'DBCLIENT\StudentA'
set @sqlcmd = 'set @UserKey = (SELECT [Key] from ' + rtrim(ltrim(@DBName)) + '.dbo.userlist where ID = ''' + rtrim(ltrim(@UserID)) + ''')'
print(@sqlcmd)
exec(@sqlcmd)
print('stuff1')
print('['+rtrim(ltrim(cast(@UserKey as nchar(4))))+']')
print('stuff2')

I oto, co zwraca:

set @UserKey = (SELECT [Key] from DB_1016a.dbo.userlist where ID = 'DBCLIENT\StudentA')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
*Msg 137, Level 15, State 1, Line 30
Must declare the scalar variable "@UserKey".*    
stuff1
[0]
stuff2

Co ja robię źle?

0
cashonly 19 marzec 2020, 22:29

2 odpowiedzi

Najlepsza odpowiedź

Musisz powiązać parametr wyjściowy w dynamicznej partii SQL i przypisać lokalną zmienną do parametru. Lubię to:

DECLARE @sqlcmd nchar(1024);
DECLARE @DBName nchar(30) = 'DB_1016a'
DECLARE @UserKey int;
DECLARE @UserID nchar(30) = 'DBCLIENT\StudentA'
set @sqlcmd = 'set @UserKey = (SELECT [Key] from ' + rtrim(ltrim(@DBName)) + '.dbo.userlist where ID = ''' + rtrim(ltrim(@UserID)) + ''')'
print(@sqlcmd)
exec sp_executesql @sqlcmd, N'@UserKey int out', @UserKey = @UserKey output
print('stuff1')
print('['+rtrim(ltrim(cast(@UserKey as nchar(4))))+']')
print('stuff2')
4
David Browne - Microsoft 19 marzec 2020, 19:37

Masz do czynienia z problemem z zakresem. Instrukcja zawarta w @sqlcmd ma inny zakres wykonania niż ten, w którym deklarujesz @UserKey, kiedy uruchamiasz ją z exec.

1
squillman 19 marzec 2020, 19:35