【问题标题】:SQL Server stored procedure concat string as querySQL Server 存储过程连接字符串作为查询
【发布时间】:2017-08-07 12:54:38
【问题描述】:

我想知道是否可以将我的 sql 查询的某些部分定义为字符串。

我编写了下面的代码,但无法将预定义的字符串部分连接到现有查询。

实际上@sirketid@uzman@basvurukodu 参数效果很好,但是@ORA_BASVURU_KESIN_KOSUL 参数会导致问题。

我认为因为它有一些特定于 sql 的表达式,如 ,它的处理方式与用于比较或分配的简单变量(如 @sirket_id)不同。 p>

它不会抛出任何错误消息,代码根本不会执行操作。

SET @ORA_BASVURU_KESIN_KOSUL = 'and akftif = 1';

UPDATE basvuru 
SET sirket = @sirketid,
    talep_gorevlendirme_rapor = 'G',
    birimi = 'SS', 
    uzman = @uzman,
WHERE
    kod = @basvurukodu + ' ' + @ORA_BASVURU_KESIN_KOSUL; 

我可以像这样连接查询部分吗?如果可以,如何连接?

谢谢

【问题讨论】:

  • 您将需要动态 sql。首先连接你要执行的整个 SQL,最后用 EXEC 执行 SQL
  • 你不能像这样连接新的条件。为此,您必须使查询动态
  • Background material for your perusalthis 更一般地用于动态 SQL。关于这个话题有很多话要说。由于涉及注入的风险,将任意 SQL 作为参数传递几乎从来都不是一个好方法。
  • 这真的比我想象的要复杂:)

标签: sql sql-server database string stored-procedures


【解决方案1】:

您的查询应该是这样的:

  1. 连接整个查询
  2. 使用EXEC 执行查询

当然你也必须声明其他变量:

SET @ORA_BASVURU_KESIN_KOSUL = 'and akftif = 1';

DECLARE @MyExecSQL varchar(2000) =
    'UPDATE basvuru 
        SET sirket = @sirketid
           ,talep_gorevlendirme_rapor = ''G''
           ,birimi = ''SS''
           ,uzman = ' + @uzman + 
     ' WHERE kod = ' + @basvurukodu + 
        ' ' + @ORA_BASVURU_KESIN_KOSUL + ''
;     
EXEC @MyExecSQL

【讨论】:

  • 使用NVARCHAR(MAX),没有理由满足于更少。 @sirketid 将未定义。以这种方式连接字符串参数是行不通的,它们需要被转义。使用带参数的EXEC 而不是sp_executesql 可能会导致大量查询计划缓存污染。使用动态 SQL,魔鬼在细节中。
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多