为什么sql server冗余地执行第二个语句?

时间:2014-07-02 22:02:19

标签: sql-server sql-server-2014

如果表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块解决这个问题?

2 个答案:

答案 0 :(得分:2)

解释T-SQL,因此它首先要确保所有内容都有效。您可以使用动态SQL解决它,但这非常混乱。

答案 1 :(得分:1)

问题不在于第二个语句是已执行。 "问题"是整个语句在运行之前编译。

所以,编译第二个语句。并且,当表格不存在时,您会收到编译错误。

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

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;