参数输入的列名无效
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;
这里真的让我头疼,很多 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;