我正在尝试创建一个基于用户选择的提供汇率的存储过程。
当我只键入这个查询时,它工作得很好:
SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = 'GBP'

然而,当我试图将其转换到存储过程:时,
ALTER PROCEDURE [dbo].[TEST] (@CCY char(3))
AS
BEGIN
SET NOCOUNT ON;
EXEC('
SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = ' + @CCY + '
')
END我得到了下面的错误消息,但我不知道原因。

发布于 2022-02-10 13:27:01
除了设计问题(请参阅注释)外,您的动态代码还试图执行以下查询:
SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = GBP因此,它尝试将列代码与列GBP匹配。因此出现了错误。
使用字符串转换构建动态SQL的方法是在字符串周围使用两次单引号,如下所示:
'SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = ''' + @CCY + '''
'在执行时,重复的单引号被转换为单引号。
发布于 2022-02-10 13:47:31
不清楚为什么要在这里使用动态SQL,也许您应该充实一下您的示例。
但是,您需要做的是使用sp_executesql正确地参数化它。不要像在另一个答案中那样注射。
ALTER PROCEDURE [dbo].[TEST] (@CCY char(3))
AS
SET NOCOUNT ON;
DECLARE @sql nvarchar(max) = N'
SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = @CCY;
';
EXEC sp_executesql
@sql,
N'@CCY char(3)',
@CCY = @CCY;发布于 2022-02-10 14:26:05
在这里您根本不需要动态SQL,您得到错误的原因是因为您需要。正如您已经确认的那样,您拥有的语句实际上就是您所拥有的全部(没有隐藏的要求),只需在您的过程中使用您的非动态语句:
ALTER PROCEDURE [dbo].[TEST] (@CCY char(3)) AS
BEGIN
SET NOCOUNT ON;
SELECT RATE
FROM USERCONFIG.dbo.curr
WHERE CODE = @CCY;
END;https://stackoverflow.com/questions/71065485
复制相似问题