首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL动态汇率

SQL动态汇率
EN

Stack Overflow用户
提问于 2022-02-10 12:54:41
回答 3查看 49关注 0票数 -1

我正在尝试创建一个基于用户选择的提供汇率的存储过程。

当我只键入这个查询时,它工作得很好:

代码语言:javascript
复制
SELECT RATE 

FROM USERCONFIG.dbo.curr 

WHERE CODE = 'GBP'

然而,当我试图将其转换到存储过程:时,

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[TEST] (@CCY char(3))

AS
BEGIN

    SET NOCOUNT ON;

EXEC('

SELECT RATE 

FROM USERCONFIG.dbo.curr 

WHERE CODE = ' + @CCY + '
    
    ')
    
END

我得到了下面的错误消息,但我不知道原因。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-02-10 13:27:01

除了设计问题(请参阅注释)外,您的动态代码还试图执行以下查询:

代码语言:javascript
复制
SELECT RATE 
FROM USERCONFIG.dbo.curr 
WHERE CODE = GBP

因此,它尝试将列代码与列GBP匹配。因此出现了错误。

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

代码语言:javascript
复制
'SELECT RATE 
 FROM USERCONFIG.dbo.curr 
 WHERE CODE = ''' + @CCY + '''
'

在执行时,重复的单引号被转换为单引号。

票数 -2
EN

Stack Overflow用户

发布于 2022-02-10 13:47:31

不清楚为什么要在这里使用动态SQL,也许您应该充实一下您的示例。

但是,您需要做的是使用sp_executesql正确地参数化它。不要像在另一个答案中那样注射。

代码语言:javascript
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2022-02-10 14:26:05

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

代码语言:javascript
复制
ALTER PROCEDURE [dbo].[TEST] (@CCY char(3)) AS
BEGIN

    SET NOCOUNT ON;

    SELECT RATE 
    FROM USERCONFIG.dbo.curr 
    WHERE CODE = @CCY;
    
END;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71065485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档