Sql server 在另一个数据库中创建存储过程

Sql server 在另一个数据库中创建存储过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,是否可以单独使用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=nch

是否可以单独使用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必须是脚本的第一行。啊

T-SQL的语法不允许您执行以下操作:

创建[OtherDatabase].[dbo].[Test]

这真是太可惜了,因为这会是一种享受!您可以使用Select语句来实现这一点,但它是不一致的:

从[OtherDatabase]…[TheTable]中选择*


干杯,Rob。

我想您可以使用xp\u cmdshell向osql付费。

这很痛苦,但我就是这么做的。我从我在sqlteam上找到的一个例子中得出了这个结论,我认为-我不加选择地替换
的方式可能会有一些引用问题:

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)

我不认为这可以用TSQL完成

您可以使用一个SSIS包,该包将名称循环并动态连接到服务器,从而创建所需的模式(procs)

这可能是我会做的,因为这意味着它都包含在包中


通过使用包含要将架构部署到的服务器/数据库列表的表或外部xml文件,可以保持配置的独立性。

这就是我使用Alter过程所做的:

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
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)

嗯,是的,我可以看到它起作用了。和Exec中的Exec。孩子,这句话会让人毛骨悚然的!如果先用exec更改数据库,然后用exec更改storedproc会怎么样?我也会这样做:首先在“go”之前发送部件,然后(在第二条SQL语句中)发送“create proc…”这是一种干净的方法,尽管我不得不将数据类型更改为
NVARCHAR(MAX)