SQL Server 2008 R2 与 SQL Server 2014 中 TRUNCATE TABLE 的名称解析

Name Resolution of TRUNCATE TABLE in SQL Server 2008 R2 vs SQL Server 2014

我们在 SQL Server 2014 中执行的代码中遇到错误,而在 SQL Server 2008 R2 中没有遇到。

我们的代码是这样的:

IF EXISTS (
SELECT 1
FROM master.dbo.sysdatabases
WHERE name = N'WebDB'
)
BEGIN
    TRUNCATE TABLE [WebDB].[dbo].[webtable] 
END

Truncate Table 命令只有在 WebDB 存在时才会执行。在 SQL Server 2008 R2 中,此代码运行没有任何问题。在 SQL Server 2014 中,存在一个问题,当 WebDB 不存在时,它会抛出一个错误,提示“数据库 'WebDB' 不存在。”。它在实际执行之前对 TRUNCATE TABLE 命令进行名称解析。

有人可以解释 SQL Server 2014 的这种行为变化吗?

SQL 编辑器解析代码没有任何错误,但在运行时 SQL 引擎抛出错误

我无法解释行为变化的原因,但您可以将示例代码转换为动态 SQL 并使用 sp_executeSQL 命令执行,如下所示

IF EXISTS (
    SELECT * FROM master.dbo.sysdatabases WHERE name = N'WebDB'
)
BEGIN
    declare @sql nvarchar(100) = N'TRUNCATE TABLE [WebDB].[dbo].[webtable]'
    exec sp_executeSql @sql
END

Actually the problem is because the existence of the database is evaluated when parsing the script, before running it. All statements are parsed independently of the condition for their execution.

这是 SQL 2008 年没有做的事情。

无论如何,您可以按以下方式更新您的查询。

IF EXISTS (
SELECT 1
FROM master.dbo.sysdatabases
WHERE [name] = N'WebDB'
)
BEGIN
    DECLARE @T NVARCHAR(1000)
    SET @T = N'TRUNCATE TABLE [WebDB].[dbo].[webtable]'
    EXECUTE SP_EXECUTESQL @T 

END

这不是 SSMS 行为,此更改已在核心中完成,即使您 运行 您的查询使用 SQLCMD 您也会观察到相同的行为。