Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在T-SQL中为数据库名称使用变量?_Sql Server - Fatal编程技术网

Sql server 如何在T-SQL中为数据库名称使用变量?

Sql server 如何在T-SQL中为数据库名称使用变量?,sql-server,Sql Server,我在脚本中的几个地方使用了数据库名称,我希望能够快速更改它,因此我正在寻找类似以下内容: DECLARE @DBNAME VARCHAR(50) SET @DBNAME = 'TEST' CREATE DATABASE @DBNAME GO ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90 GO ALTER DATABASE @DBNAME SET RECOVERY SIMPLE GO declare @query varchar(ma

我在脚本中的几个地方使用了数据库名称,我希望能够快速更改它,因此我正在寻找类似以下内容:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO
declare @query varchar(max);
set @query = 'create database TEST...';

exec (@query);

但它不起作用。那么,编写此代码的正确方法是什么呢?

不能在create table语句中使用变量。我能建议的最好办法是将整个查询写成一个字符串并执行它

试着这样做:

DECLARE @DBNAME VARCHAR(50)
SET @DBNAME = 'TEST'

CREATE DATABASE @DBNAME
GO
ALTER DATABASE @DBNAME SET COMPATIBILITY_LEVEL = 90
GO
ALTER DATABASE @DBNAME SET RECOVERY SIMPLE 
GO
declare @query varchar(max);
set @query = 'create database TEST...';

exec (@query);

不幸的是,不能用这种格式的变量声明数据库名称

对于要完成的任务,您需要将语句包装在EXEC()语句中。所以你会有这样的想法:

DECLARE @Sql varchar(max) ='CREATE DATABASE ' + @DBNAME
然后打电话

EXECUTE(@Sql) or sp_executesql(@Sql)

执行sql字符串。

将整个脚本放入带有{SERVERNAME}占位符的模板字符串中。然后使用以下命令编辑字符串:

SET @SQL_SCRIPT = REPLACE(@TEMPLATE, '{SERVERNAME}', @DBNAME)
然后运行它

EXECUTE (@SQL_SCRIPT)

很难相信,在三年的时间里,没有人注意到我的代码不起作用

您不能执行多个批处理
GO
是一个批处理分隔符,而不是T-SQL语句。有必要构建三个单独的字符串,然后在替换后对每个字符串执行
EXEC

我想,通过在
GO
上拆分,可以将单个模板字符串拆分为多行,从而实现“聪明”的操作;我已经在ADO.NET代码中完成了

“服务器名”这个词是从哪里来的

下面是我刚刚测试过的一些代码(这些代码是有效的):

您也可以使用此模式(在ManagementStudio的“查询”菜单上启用此模式)

编辑:


查看本文,通过SQLCMD工具设置参数。

+1非常好的方法。。。你刚刚把我从繁重的工作中救了出来,谢谢。。。虽然它应该被执行(@SQL_SCRIPT),或者至少这对我来说是有效的。但是需要小心转义。
SYSNAME
将是比
VARCHAR(255)
更合适的数据类型。还应该使用
QUOTENAME
来处理所有可能的数据库名称若我想使用
使用{DBNAME}在其他数据库中
创建模式
,则(可能是为了防止SQL注入,具体取决于名称的来源)不起作用
.Schema在错误的数据库中创建;/
EXEC
查找存储过程。在这种情况下,需要执行
EXECUTE
。实际上我需要道歉。事实证明
EXEC
EXECUTE
是相同的。我在执行
EXEC
失败并执行
EXECUTE
成功后发表了声明。尽管obv很明显,我真正的问题与这两者都无关。不要在生产中这样做……永远不要这样做。@MagicOctopusUrn改变了以前的帖子和评论,但我很好奇为什么不这样做?它不应该是特定于需求的吗???@MagicOctopusUrn是因为潜在的注入吗?这个方法如何使用已经声明的变量?而不是“测试”你能添加一个@dbName吗?我试过了,但没有work@sycleeTSQL变量?否在脚本发送到服务器之前执行sqlcmd替换。@MartinSmith嘿,我想要db名称作为输出命令。那么如何使用sqlcmd获得它呢。?