繁体   English   中英

SQL 动态汇率

[英]SQL Dynamic Exchange Rate

我正在尝试创建一个存储过程,它根据用户的选择提供汇率。

当我简单地输入这个查询时,它工作正常:

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

我收到以下错误消息,但无法弄清楚原因。

在此处输入图像描述

目前还不清楚你为什么在这里使用动态 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;

你根本不需要 Dynamic SQL ,你收到错误的原因是因为你是。 正如您已经确认您所拥有的语句实际上就是您所拥有的(没有隐藏的要求),只需在您的过程中使用您的非动态语句:

ALTER PROCEDURE [dbo].[TEST] (@CCY char(3)) AS
BEGIN

    SET NOCOUNT ON;

    SELECT RATE 
    FROM USERCONFIG.dbo.curr 
    WHERE CODE = @CCY;
    
END;

除了设计问题(见评论)之外,您的动态代码还尝试执行以下查询:

SELECT RATE 
FROM USERCONFIG.dbo.curr 
WHERE CODE = GBP

因此它尝试将列 CODE 与列 GBP 匹配。 因此错误。

使用字符串转换构建动态 SQL 的方法是在字符串周围使用两次单引号,例如:

'SELECT RATE 
 FROM USERCONFIG.dbo.curr 
 WHERE CODE = ''' + @CCY + '''
'

重复的单引号在执行时变成单引号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM