none
\ 在 sp_executesql 和 EXEC 中有什么特殊意义? RRS feed

  • 问题

  • DECLARE @sql nvarchar(4000) = N'
    DECLARE @i int = 1;
    --\
    WHILE @i > 0 SET @i = @i - 1;
    SELECT @i;
    ';
    EXEC sp_executesql @sql;
    EXEC(@sql);
    DECLARE @i int = 1;
    --\
    WHILE @i > 0 SET @i = @i - 1;
    SELECT @i;
    

    结果是(在 sp_executesql 和 EXEC 中,循环没有执行,神奇了,不要 \ 没有问题):


    -----------
    1
    (1 行受影响)

    -----------
    1
    (1 行受影响)

    -----------
    0
    (1 行受影响)

    2016年10月25日 6:51

答案

  • 找到说明了:

    https://msdn.microsoft.com/zh-cn/library/dd207007.aspx?f=255&MSPPError=-2147217396

    平时还真没有注意这个问题

    2016年10月25日 10:24

全部回复

  • 似乎是。。。,但文档中没有问题

    DECLARE @sql nvarchar(4000) = N'
    DECLARE @i int = 10;
    select ''a\
    \b\c\
    \d\
    \na''
    ';
    EXEC sp_executesql @sql;
    
    结果是: a\b\c\d\na

    2016年10月25日 6:55
  • 我怀疑是行尾换行被处理掉了,--导致的问题,你试试用/**/把\包起来。

    想不想时已是想,不如不想都不想。

    2016年10月25日 8:14
    版主
  • \还是转意符作用

    sql改为:

    DECLARE @sql nvarchar(4000) = N'
    print ''1'';
    --\
    print ''2'';
    ';
    EXEC sp_executesql @sql;
    EXEC(@sql);
    
    print '1';
    --\
    print '2';

    更加直观。

    \后面的回车换行被转意,导致后面的语句被认为是注释,所以没执行。不在字符串中则无效(查询分析器直接执行语句,只能注释当前行)


    family as water



    • 已编辑 Stone Z 2016年10月25日 8:27
    2016年10月25日 8:25
  • 找到说明了:

    https://msdn.microsoft.com/zh-cn/library/dd207007.aspx?f=255&MSPPError=-2147217396

    平时还真没有注意这个问题

    2016年10月25日 10:24
  • 以前看过,一直没关注到就忘记了

    想不想时已是想,不如不想都不想。

    2016年10月26日 6:06
    版主