Как я могу исправить эту ошибку SQL в этом запросе - PullRequest
1 голос
/ 02 июня 2009
DECLARE @providerIdList varchar(400)
DECLARE @q varchar(400)

SELECT @q  =  ''

SELECT @providerIdList = '(1, 5, 15)'


SET @q = 'SELECT u.Id FROM [user] u
    LEFT JOIN Provider p ON u.Provider_FK = p.Id
    LEFT JOIN  Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk
    WHERE p.Id  IN ' + @providerIdList




exec @q

Вот исключение, которое я получаю, когда пытался выполнить запрос, показанный выше


Msg 203, Level 16, State 2, Line 18
The name 'SELECT u.Id FROM [user] u
    LEFT JOIN Provider p ON u.Provider_FK = p.Id
    LEFT JOIN  Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk
    WHERE p.Id  IN (1, 5, 15)' is not a valid identifier.

Я был бы очень признателен, если бы кто-нибудь указал мне причину этих ошибок

Ответы [ 6 ]

8 голосов
/ 02 июня 2009

Вы ищете sp_executesql . Сделайте это вместо:

DECLARE @providerIdList nvarchar(400)
DECLARE @q nvarchar(400)

SELECT @q  =  N''

SELECT @providerIdList = N'(1, 5, 15)'


SET @q = N'SELECT u.Id FROM [user] u
    LEFT JOIN Provider p ON u.Provider_FK = p.Id
    LEFT JOIN  Providers2Users pu ON pu.user_FK = u.Id 
    LEFT JOIN Provider ap ON ap.Id = pu.provider_fk
    WHERE p.Id  IN ' + @providerIdList

exec sp_executesql @q

То, что вы сейчас делаете, пытается вызвать команду как хранимую процедуру, чего явно нет. sp_executesql - это системная хранимая процедура, которая позволяет вам выполнить допустимый оператор SQL. Системные хранимые процедуры находятся в базе данных master, к вашему сведению.

5 голосов
/ 02 июня 2009

Вы также можете использовать

exec(@q)

это выполнит литеральную строку.

Разница в скобках!

0 голосов
/ 03 июня 2009

Или учитывая то, что вы показываете в качестве кода, я бы вообще не использовал динамический SQL. По возможности следует избегать динамического SQl.

SELECT u.Id FROM [user] u    
LEFT JOIN Provider p ON u.Provider_FK = p.Id    
LEFT JOIN  Providers2Users pu ON pu.user_FK = u.Id     
LEFT JOIN Provider ap ON ap.Id = pu.provider_fk    
WHERE p.Id  IN (1, 5, 15)
0 голосов
/ 03 июня 2009

объявить @params NVARCHAR (4000)
объявить @sql NVARCHAR (4000)

SET @providerIdList = '(1, 5, 15)'

SET @sql = 'ВЫБЕРИТЕ u.Id ИЗ [user] u ЛЕВОГО СОЕДИНИТЕЛЯ ОБЪЕДИНЕНИЯ p ON u.Provider_FK = p.Id СЛЕДУЮЩИХ СОЕДИНИТЕЛЕЙ СОЕДИНЕНИЯ pu.provider_fk ГДЕ p.Id IN '+ @ providerIdList'

SELECT @params = N '@ providerIdList VARCHAR OUTPUT'

exec sp_executesql @sql, @ params, @ providerIdList = @ providerIdList

0 голосов
/ 03 июня 2009

Хорошо, убедитесь, что вы используете NVARCHAR, а не VARCHAR. Просто тогда вы можете использовать EXEC sp_executesql @q.

0 голосов
/ 02 июня 2009

вы пытаетесь выполнить хранимую процедуру @q, которая недопустима, используйте:

execute (@q)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...