【问题标题】:Invalid Column name on parameter input参数输入上的列名无效
【发布时间】:2019-07-05 11:50:18
【问题描述】:

真的把我的头搞砸了,就像许多 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 子句中的 COUNTRY 列中调用 GB 的行?

我知道这希望是一个简单的修复,所以任何帮助将不胜感激,即使您认为有更好的方法来编写 SP!

提前谢谢各位。

【问题讨论】:

  • 提示:打印出 SQL 而不是执行它,您应该会立即看到问题...
  • 提示 2:这种生成 SQL 的方法非常容易受到 SQL 注入攻击。
  • 我建议参数化 SQL 否则你应该正确处理转义引号
  • 相关...xkcd.com/327

标签: sql-server stored-procedures ssms


【解决方案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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-02
      • 2021-07-21
      • 2020-12-12
      相关资源
      最近更新 更多