2017-07-10 76 views
-1

我希望能够动态更改存储过程/视图中的数据库名称。在存储过程中动态设置数据库名称

实施例:

SELECT USER_FNM 
FROM MYBASE_01.DBO.USERS 

我想有MYBASE_01动态的,或许存储在某些变量。这可能吗?

我这样做的原因是我有许多视图,其中包含数据库名称。通过部署,我必须在每个视图中更改此名称。如果数据库名称只能存储在一个变量中,那将更容易,所以不需要为所有视图更改它。

+0

您可以执行一个dymanic SQL字符串,其中您的名字中包含一个字符串变量。你会将你的查询嵌入到'EXEC()' – EMUEVIL

+0

对于存储过程,你可以利用动态sql(尽管这是一个标志,某种东西不是理想的设计),但是你的视图被卡住了。您不能在视图中使用动态sql或变量。 –

+1

听起来更像是部署脚本中的SQLCMD变量('$(database)')。你真的打算在* runtime *处更改数据库吗?如果是这样,从您的客户端软件连接上发出'USE数据库'更有意义。如果您以这种方式访问​​的对象数量有限,请考虑['CREATE SYNONYM'](https://docs.microsoft.com/sql/t-sql/statements/create-synonym-transact-sql)将它们别名透明。 –

回答

1

您可以使用动态SQL在动态表上执行查询。只要字符串文字“@DBNAMEVAR”没有出现在其他地方的查询中,这应该可以工作。为了将您的查询转换为字符串,只需用两个单引号替换任何单引号,然后放一个单引号和开头和结尾。

注意:这很容易受到SQL注入的影响,所以请将输入清理干净,否则有人可能会要求您的数据库执行任何操作。

DECLARE @DBNAMEVAR nvarchar(100); SET @DBNAMEVAR = 'MYBASE_01'; 
DECLARE @sql nvarchar(max); 

SET @sql = REPLACE('SELECT USER_FNM FROM @DBNAMEVAR.DBO.USERS','@DBNAMEVAR',@DBNAMEVAR) 
EXEC(@sql) 
+1

请注意,这是易受sql注入。 –

+0

['QUOTENAME'](https://docs.microsoft.com/sql/t-sql/functions/quotename-transact-sql)是你的朋友。 –

+0

@JeroenMostert谢谢你的提示!我以前看过这个命令,但从未在任何地方应用过。 – EMUEVIL

相关问题