参数输入中的列名无效

时间:2019-07-05 11:50:18

标签: sql-server stored-procedures ssms

在这里真的很伤脑筋,因为很多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'

返回错误 Invalid column name 'GB'.令我感到奇怪,因为我从来没有调用过GB列,而是在where子句的GB列中调用了带有COUNTRY的行?

我希望这是一个简单的修复程序,因此,即使您认为有更好的方式编写SP,也将不胜感激任何帮助!

先谢谢大家。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

apple tutorial link