0

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

4

2 回答 2

2

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

于 2014-07-02T22:06:21.973 回答
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;
于 2014-07-03T02:55:28.760 回答