任何想法是否可以单独使用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]
中选择*干杯,罗布。
答案 0 :(得分:19)
这是一种痛苦,但这就是我所做的。我从我在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)
答案 1 :(得分:9)
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
答案 2 :(得分:2)
这就是我对Alter程序的处理方式:
DECLARE @metasql as varchar(MAX)
DECLARE @sql AS varchar(MAX)
SET @sql =
'ALTER PROCEDURE [dbo].[GetVersion]
AS
BEGIN
SET NOCOUNT ON;
SELECT TOP(1)[Version] from VersionTable
END'
SET @metasql = '
USE MyProdDb
IF (OBJECT_ID(''GetVersion'') IS NOT NULL OR OBJECT_ID(''GetVersion'', ''P'') IS NOT NULL)
BEGIN
EXEC (''' + REPLACE(@sql, '''', '''''') + ''')
END
'
--PRINT @metasql
EXEC (@metasql)
答案 3 :(得分:0)
我猜想你可以使用xp_cmdshell对osql进行shell。
答案 4 :(得分:0)
我不认为这可以用TSQL完成。
您可以使用SSIS包来循环名称并动态连接到服务器,从而创建所需的模式(过程)。
这可能是我要做的,因为它意味着它都包含在包中。
可以使用包含要部署架构的服务器/数据库列表的表或外部xml文件来单独配置。