SQL Server存储过程:将字符串连接作为查询

4
我想知道是否可以将MySQL查询的某些部分定义为字符串。
我尝试了下面的代码,但是我无法将预定义的字符串部分连接到现有的查询中。
实际上,@sirketid@uzman@basvurukodu参数很好用,但是@ORA_BASVURU_KESIN_KOSUL参数会引起问题。
我认为这是因为它具有一些SQL特定表达式,如and,它与用于比较或赋值的简单变量(例如@sirket_id)不同。
它不会抛出任何错误消息,代码只是不执行操作。
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。 - Esteban P.
你不能像那样连接一个新条件。要做到这一点,你必须使查询动态化。 - Søren Kongstad
以下是有关编程的内容,需要您参考背景材料,以及更加普遍的动态SQL内容这里。关于这个主题还有很多要说的。由于涉及到注入风险,将任意SQL作为参数传递几乎从来不是一个好方法。 - Jeroen Mostert
这比我想象中的要复杂 :) - Ali insan Soyaslan
1个回答

5

你的查询应该像这样工作:

  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

2
使用NVARCHAR(MAX),没有理由要满足于更少的内容。@sirketid将未定义。以这种方式连接字符串参数是行不通的,它们需要被转义。使用EXEC而不是带有参数的sp_executesql可能会导致大量查询计划缓存污染。在动态SQL中,细节决定成败。 - Jeroen Mostert
我不得不使用 EXEC (@MyExecSQL) - AJ Dhaliwal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接