【问题标题】:why does sql server execute the second statement redundantly?为什么sql server会冗余执行第二条语句?
【发布时间】:2014-08-23 20:57:45
【问题描述】:

如果表 Tru.Repo 不存在,我会抛出以下错误:

IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tru' AND TABLE_NAME = 'Repo')) OR 
   (NOT EXISTS (SELECT * FROM Tru.Repo WHERE RepoName = 'Tru.Repo'))
BEGIN
    print('in')
END

但我希望如果 Tru.Repo 不存在,那么第一个语句是正确的,那么为什么它会执行第二个语句?有没有办法使用单个 IF 块解决这个问题?

【问题讨论】:

标签: sql-server sql-server-2014


【解决方案1】:

T-SQL 被解释,所以它首先要确保一切都是有效的。您可以使用动态 SQL 来解决它,但这很麻烦。

【讨论】:

    【解决方案2】:

    问题不在于第二条语句被执行。 “问题”是整个语句是在运行之前编译的。

    所以,第二条语句被编译。而且,当表不存在时会出现编译错误。

    以下是解决此问题的方法:

    IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'Tru' AND TABLE_NAME = 'Repo'))
    BEGIN
        print('in')
    END
    ELSE
    BEGIN
        declare @retval int = 0;
        exec sp_execute_sql N'SELECT @retval = 1 FROM Tru.Repo WHERE RepoName = ''Tru.Repo''',
                            N'@retval int output', @retval = @retval;
        if @retval = 0
        BEGIN
            print('in')
        END
    END;
    

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2017-02-08
      • 2010-12-20
      相关资源
      最近更新 更多