参数输入的列名无效

Invalid Column name on parameter input

这里真的让我头疼,很多 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

我在 vb.net windows 表单应用程序中使用它,因此在那里应用参数。但是尝试 运行 在 SSMS 中用这个

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

Returns 错误 Invalid column name 'GB'. 我觉得很奇怪,因为我从来没有调用过名为 GB 的列,而是在我的 where 子句中的 COUNTRY 列中调用了带有 GB 的行?

我知道这是一个简单的修复,因此非常感谢任何帮助,即使您认为有更好的方法来编写 SP!

在此先感谢大家。

我建议对 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

使用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