有没有办法坚持变量?

Nit*_*xDM 73 sql sql-server sql-server-2000 sql-server-2008 sql-server-2012

有没有办法坚持变量?

Declare @bob as varchar(50);
Set @bob = 'SweetDB'; 
GO
USE @bob  --- see note below
GO
INSERT INTO @bob.[dbo].[ProjectVersion] ([DB_Name], [Script]) VALUES (@bob,'1.2')
Run Code Online (Sandbox Code Playgroud)

请参阅"USE @bob"行的SO问题.

RBa*_*ung 110

使用临时表:

CREATE TABLE #variables
    (
    VarName VARCHAR(20) PRIMARY KEY,
    Value VARCHAR(255)
    )
GO

Insert into #variables Select 'Bob', 'SweetDB'
GO

Select Value From #variables Where VarName = 'Bob'
GO

DROP TABLE #variables
go
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案......你实际上回答了问题而不是解决问题. (12认同)

Guf*_*ffa 31

go命令用于将代码拆分为单独的批处理.如果这正是您想要做的,那么您应该使用它,但这意味着批次实际上是分开的,并且您不能在它们之间共享变量.

在您的情况下,解决方案很简单; 您可以删除go语句,在该代码中不需要它们.

附注:您不能在use语句中使用变量,它必须是数据库的名称.

  • @jwize:不,你不需要将它们分开,这可以在同一个块中完成. (2认同)
  • 我否决了这个答案,因为它没有回答问题。在某些情况下,您需要使用 GO 语句拆分查询,但您仍然希望使用某种全局变量。 (2认同)

Mat*_*vic 12

我喜欢这个答案来自这个问题 与GO全局变量

除了能够做你原本想做的事情之外,还有其他好处.

需要注意的是,您需要打开SQLCMD模式(在Query-> SQLCMD下)或默认情况下为所有查询窗口打开它(工具 - >选项然后查询结果 - >默认情况下,在SQLCMD模式下打开新查询)

然后你可以使用以下类型的代码(完全从Oscar E. Fraxedas Tormo的相同答案中删除)

--Declare the variable
:setvar MYDATABASE master
--Use the variable
USE $(MYDATABASE);
SELECT * FROM [dbo].[refresh_indexes]
GO
--Use again after a GO
SELECT * from $(MYDATABASE).[dbo].[refresh_indexes];
GO
Run Code Online (Sandbox Code Playgroud)


Dan*_*ith 6

如果您使用 SQL Server,您可以为整个脚本设置全局变量,例如:

:setvar sourceDB "lalalallalal"
Run Code Online (Sandbox Code Playgroud)

并稍后在脚本中使用:

$(sourceDB)
Run Code Online (Sandbox Code Playgroud)

确保 SQLCMD 模式在 Server Managment Studi 中处于打开状态,您可以通过顶部菜单单击“查询”并打开 SQLCMD 模式来执行此操作。

有关该主题的更多信息可以在这里找到: MS 文档