在这里真的很伤脑筋,因为很多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,也将不胜感激任何帮助!
先谢谢大家。
答案 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;