как объявить базу данных как переменную в sql statment - PullRequest
1 голос
/ 13 апреля 2019

У меня проблема с объявлением базы данных SQL-оператора (MS SQL) как переменной У меня есть эта процедура, любой может помочь, спасибо:)

DECLARE @ID int = 700001158
DECLARE @STRING VARCHAR(250) = 'StringResource_EN'

SELECT string.[value],item.[id] FROM ItemResource item LEFT JOIN **@STRING** string ON item.[name_id] = string.[code]
WHERE item.[id] = @ID

Я получил ошибку:

[42000] [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Необходимо объявить табличную переменную «@STRING».(1087) Цитата

пока должен быть такой результат:

id = 700001158 value = Devildom Purge: Shield

Отредактировано: i'пробовал

DECLARE @ID int = 700001158
DECLARE @STRING VARCHAR(250) = 'StringResource_EN'
DECLARE @sql NVARCHAR(1000)

SET @sql =  'SELECT string.[value],item.[id] FROM ItemResource item LEFT JOIN '+@STRING+' string ON item.[name_id] = string.[code]
WHERE item.[id] = @ID'

EXEC sp_executesql @sql;

ТАКЖЕ я получил это

[42000] [Microsoft] [Собственный клиент SQL Server 11.0] [SQL Server] Должен объявить скалярную переменную "@ID».(137)

1 Ответ

2 голосов
/ 13 апреля 2019

Для этого вам понадобится динамический SQL:

ALTER PROCEDURE [dbo].[cpanel_get_warehouse_item]
@IN_ACCOUNT_ID      INT,
@IN_STRING_DB VARCHAR(255),
@ITEM_COUNT         INT OUTPUT,
@GOLD           INT OUTPUT

AS
SET NOCOUNT ON
SET @ITEM_COUNT = (SELECT COUNT(*) FROM [Telecaster].dbo.[Item] WHERE [account_id] = @IN_ACCOUNT_ID AND [code] > 0)
SET @GOLD = (SELECT [cnt] FROM [Telecaster].dbo.[Item] WHERE [account_id] = @IN_ACCOUNT_ID AND [code] = 0 AND [gcode] = 126)

DECLARE @sql NVARCHAR(1000);

SELECT @sql =  'SELECT string.[value] as name,item.[code] as id ,item.[cnt],item.[level],item.[enhance],data.[icon_file_name] as icon
FROM [Telecaster].dbo.[Item] item LEFT JOIN [Arcadia].dbo.[ItemResource] data on data.[id] = item.[code]
LEFT JOIN [Arcadia].dbo.' + @IN_STRING_DB +  'string on data.[name_id] = string.[code]
WHERE item.[account_id] = ' + @IN_ACCOUNT_ID' + AND item.[code] > 0 ORDER BY item.[sid] asc'

EXEC sp_executesql @sql;

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

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