任何想法是否可以单独使用T-SQL在另一个数据库中创建一个过程,其中数据库的名称是预先知道的并且必须从表中读取?有点像这个例子:
Use [MasterDatabase] Declare @FirstDatabase nvarchar(100) Select Top 1 @FirstDatabase=[ChildDatabase] From [ChildDatabases] Declare @SQL nvarchar(4000) Declare @CRLF nvarchar(10) Set @CRLF=nchar(13)+nchar(10) Set @SQL = 'Use [+'@Firstdatabase+']'+@CRLF+ 'Go'+@CRLF+ 'Create Proc [Test] As Select 123' Exec (@SQL)
看看我想做什么?此示例失败,因为Go实际上不是T-SQL命令,但它是查询分析器/ SQL管理工作室识别的内容并产生错误.删除Go并且它也失败,因为Create Proc必须是脚本的第一行.Arrgg!
T-SQL的语法不允许你这样做:
创建[OtherDatabase].[dbo].[测试]
这是一种耻辱,因为它会起作用!你可以用Select语句做到这一点,耻辱它是不一致的:
选择*来自[OtherDatabase] .. [TheTable]
干杯,罗布.
这是一种痛苦,但这就是我所做的.我从我在sqlteam上找到的一个例子中得到了这个,我想 - 你可能有一些引用问题与我做的不分青红皂白REPLACE
:
DECLARE @sql AS varchar(MAX) DECLARE @metasql as varchar(MAX) DECLARE @PrintQuery AS bit DECLARE @ExecQuery AS bit SET @PrintQuery = 1 SET @ExecQuery = 0 SET @sql = ' CREATE PROCEDURE etc. AS BEGIN END ' SET @metasql = ' USE OtherDatabase EXEC (''' + REPLACE(@sql, '''', '''''') + ''') ' IF @PrintQuery = 1 PRINT @metasql IF @ExecQuery = 1 EXEC (@metasql)
DECLARE @UseAndExecStatment nvarchar(4000), @SQLString nvarchar(4000) SET @UseAndExecStatment = 'use ' + @DBName +' exec sp_executesql @SQLString' SET @SQLString = N'CREATE Procedure [Test] As Select 123' EXEC sp_executesql @UseAndExecStatment, N'@SQLString nvarchar(4000)', @SQLString=@SQLString