这是因为 SQL Server 会解析并验证整个批次。所以在解析第二个CREATE TABLE 语句时,它会出错:
数据库中已经有一个名为“#LookupLinks”的对象。
看这个例子:
IF 1 = 1 BEGIN
CREATE TABLE #temp(col INT)
END
ELSE BEGIN
CREATE TABLE #temp(col INT)
END
它会产生一个错误:
数据库中已经有一个名为“#temp”的对象。
解决方法是使用Dynamic SQL。
-- CREATE the table for testing
IF OBJECT_ID('tempdb..#LookupLinks') IS NOT NULL
DROP TABLE #LookupLinks
CREATE TABLE #LookupLinks(
[SyncID] uniqueidentifier,
[Name] nvarchar(50),
[SQLTable] nvarchar(50)
)
-- Final query
IF OBJECT_ID('tempdb..#LookupLinks') IS NOT NULL BEGIN
TRUNCATE TABLE #LookupLinks
PRINT N'#LookupLinks already existed and was truncated.'
END
ELSE BEGIN
DECLARE @sql NVARCHAR(MAX) = ''
SELECT @sql = '
CREATE TABLE #LookupLinks(
[SyncID] uniqueidentifier,
[Name] nvarchar(50),
[SQLTable] nvarchar(50)
)'
EXEC sp_executesql @sql
PRINT N'#LookupLinks was created.'
END
如果您没有第一个CREATE TABLE 语句,您的查询将正常工作。或者,如果您在 BEGIN TRY 之前放置 GO。
IF OBJECT_ID('tempdb..#LookupLinks') IS NOT NULL
DROP TABLE #LookupLinks -- DROP FIRST
CREATE TABLE #LookupLinks(
[SyncID] uniqueidentifier,
[Name] nvarchar(50),
[SQLTable] nvarchar(50)
) --I create this just to test my try-catch
GO
BEGIN TRY
CREATE TABLE #LookupLinks(
[SyncID] uniqueidentifier,
[Name] nvarchar(50),
[SQLTable] nvarchar(50)
)
END TRY
BEGIN CATCH
PRINT N'#LookupLinks already existed and was truncated.';
TRUNCATE TABLE #LookupLinks
END CATCH
仍然是因为 SQL Server 解析并验证了整个批次。 GO 语句会将语句放入它们自己的批处理中,因此现在不会发生错误。
即使 CeOnSql 的 answer 也可以正常工作。