Неверное имя столбца при вводе параметра - PullRequest
0 голосов
/ 05 июля 2019

На самом деле моя голова разрушена, и, как и многие другие проблемы с SQL, я знаю, что это, вероятно, что-то глупое и глупое, но я просто не могу заставить его работать.

У меня есть хранимая процедура, которая это ..

ALTER PROCEDURE [dbo].[RETURN_DATA](@TABLE_param VARCHAR(7),@COUNTRY_param VARCHAR(2),@FILEDATE_param int,@TTKT_param VARCHAR(6))



AS
BEGIN

    SET NOCOUNT ON;


    SELECT @SQL = 'Select * from ' + @TABLE_param + ' WHERE COUNTRY = ' + @COUNTRY_param + ' AND MONTH(Fil_Dte) = ' + cast(@FILEDATE_param as varchar(20)) + ' AND TRNN = '+ @TKTT_param

    EXECUTE(@SQL)


END

Я использую его в приложении Windows Form vb.net, поэтому применяю параметры там. Но пытаясь запустить его в SSMS с этим

exec RETURN_DATA @COUNTRY_param='GB',@FILEDATE_param=4,@TABLE_param='table30',@TTKT_param='000000'

Возвращает ошибку Invalid column name 'GB'., что мне кажется странным, поскольку я никогда не вызывал столбец с именем GB, но вызывал строки с GB в столбце COUNTRY в предложении where?

Я знаю, что это, надеюсь, простое исправление, поэтому любая помощь будет принята с благодарностью, а также, даже если вы считаете, что есть лучший способ написать SP!

Заранее спасибо, ребята.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Используйте sp_executesql для запуска динамического sql

DECLARE @SQL NVARCHAR (4000);

SET @SQL = '
Select *
from ' + QUOTENAME(@TABLE_param) + '
WHERE COUNTRY = @COUNTRY_param 
AND MONTH(Fil_Dte) = @FILEDATE_param
AND TRNN = @TTKT_param
';

EXEC sp_executesql @SQL, 
N'@COUNTRY_param VARCHAR(2), @FILEDATE_param int, @TTKT_param VARCHAR(6)', 
@COUNTRY_param, @FILEDATE_param, @TTKT_param;

sp_executesql

1 голос
/ 05 июля 2019

Я бы порекомендовал параметризовать SQL, который защитит от внедрения SQL, и вам не нужно беспокоиться о экранировании кавычек, как показано ниже

ALTER PROCEDURE [dbo].[RETURN_DATA](@TABLE_param VARCHAR(7),@COUNTRY_param VARCHAR(2),@FILEDATE_param int,@TTKT_param VARCHAR(6))

AS
BEGIN
    SET NOCOUNT ON;

    SELECT @SQL = 'Select * from ' + @TABLE_param + ' WHERE COUNTRY = ''' + @COUNTRY_param + ''' AND MONTH(Fil_Dte) = ' + cast(@FILEDATE_param as varchar(20)) + ' AND TRNN = '''+ @TKTT_param +''''

    EXECUTE(@SQL)
END
...