尝试使用一个可在多种环境中运行的SQL脚本,但USE
语句会导致其他环境出错,即在下面的示例中, SQL02,USE [application]
,即使在BEGIN ... END
内?
-- connected to SQL02
DECLARE @STAGE INTEGER = 3
IF @@SERVERNAME = 'SQL02'
SET @STAGE = 1
IF @@SERVERNAME = 'SQL03'
SET @STAGE = 2
IF @STAGE = 1
BEGIN
IF EXISTS ( SELECT *
FROM [application_tst].[sys].[database_principals]
WHERE name = N'qauser' )
BEGIN
USE [application_tst]
--rest of code
END
END
IF @STAGE = 2
BEGIN
IF EXISTS ( SELECT *
FROM [application].[sys].[database_principals]
WHERE name = N'qauser' )
BEGIN
USE [application]
--rest of code
END
END
答案 0 :(得分:2)
您需要在任何地方使用明确的三个部分名称而不使用USE
。 USE是一个执行时间命令,您的批处理将无法按预期编译,因为您希望在编译期间发生名称解析就好像已执行一样 EM>
-- connected to SQL02
DECLARE @STAGE INTEGER = 3
IF @@SERVERNAME = 'SQL02'
SET @STAGE = 1
IF @@SERVERNAME = 'SQL03'
SET @STAGE = 2
IF @STAGE = 1
BEGIN
IF EXISTS ( SELECT *
FROM [application_tst].[sys].[database_principals]
WHERE name = N'qauser' )
BEGIN
select from [application_tst].dbo.table
insert into [application_tst].dbo.table
--rest of code, using explicit 3 part names
END
END
IF @STAGE = 2
BEGIN
IF EXISTS ( SELECT *
FROM [application].[sys].[database_principals]
WHERE name = N'qauser' )
BEGIN
select from [application].dbo.table
insert into [application].dbo.table
--rest of code, using explicit 3 part names
END
END
另一种方法是使用dynamic sql,这将延迟编译直到被调用。