Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server存储过程concat字符串作为查询_Sql_Sql Server_Database_String_Stored Procedures - Fatal编程技术网

SQL Server存储过程concat字符串作为查询

SQL Server存储过程concat字符串作为查询,sql,sql-server,database,string,stored-procedures,Sql,Sql Server,Database,String,Stored Procedures,我想知道是否可以将sql查询的某些部分定义为字符串 我编写了下面的代码,但无法将预定义的字符串部分连接到现有查询中 实际上,@sirketid,@uzman,@basvurukodu参数运行良好,但是@ORA_BASVURU_KESIN_KOSUL参数正在引发问题 我认为,由于它有一些sql特殊表达式,如和,因此与用于比较或赋值的简单变量(如@sirket\u id)不同 它不会抛出任何错误消息,代码不会执行操作 SET @ORA_BASVURU_KESIN_KOSUL = 'and akfti

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

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

实际上,
@sirketid
@uzman
@basvurukodu
参数运行良好,但是
@ORA_BASVURU_KESIN_KOSUL
参数正在引发问题

我认为,由于它有一些sql特殊表达式,如,因此与用于比较或赋值的简单变量(如
@sirket\u 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; 
我可以查询这样的部分吗?如果可以,如何查询


谢谢

您的查询应该如下所示:

  • 连接整个查询
  • 使用
    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
    

    您将需要动态sql。首先连接要执行的整个SQL,最后使用execute执行SQL。您不能像这样连接新的条件。要做到这一点,您必须使查询成为动态的,而且对于动态SQL来说更一般。关于这个话题有很多话要说。由于涉及注入的风险,将任意SQL作为参数传递几乎从来都不是一个好方法。这比我想象的要复杂得多:)使用
    NVARCHAR(MAX)
    ,没有理由满足于更少的要求<代码>@sirketid将被取消定义。以这种方式连接字符串参数是行不通的,需要对它们进行转义。使用带有参数的
    EXEC
    而不是
    sp_executesql
    ,可能会导致大量查询计划缓存污染。使用动态SQL,魔鬼就在细节中。