異なるデータベースでプロシージャを作成しようとしています。私はデータベースの名前を知っているはずがありません。私は動的な方法でデータベースの名前を取得するための最初のものと、プロシージャを作成/変更するための入れ子のカーソルを作成しようとしました。私はプロシージャを作成するためにEXISTSを使用し、それらを変更するためにEXISTSは使用しませんでした。しかし、何らかの形でデータベースは「マスター」に固執し、それは他のものにループしません。私は内側のネストカーソルに問題があることを知っていますが、これが何であるか分かりません。 は、ここに私のコードです:カーソルを使用して異なるデータベース内でプロシージャを作成する方法
DECLARE GetDatabases CURSOR
FOR
SELECT name
FROM sys.databases
OPEN GetDatabases
DECLARE @DBName NVARCHAR(100)
DECLARE @cmd NVARCHAR(Max)
FETCH NEXT
FROM GetDatabases
INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
set @cmd='use ' + @DBName
print @cmd
exec sp_executesql @cmd
FETCH NEXT
FROM GetDatabases
INTO @DBName
DECLARE AutoProc CURSOR
FOR
SELECT TABLE_SCHEMA,TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
OPEN AutoProc
DECLARE @TableName NVARCHAR(100)
DECLARE @TableSchema NVARCHAR(100)
FETCH NEXT
FROM AutoProc
INTO @TableSchema,@TableName
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS(SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('@TableName'))
exec('ALTER PROCEDURE USP_SELECT_'[email protected]+' AS
BEGIN
SELECT *
FROM '[email protected]+'.'[email protected]+'
END ;')
IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('@TableName'))
exec('CREATE PROCEDURE USP_SELECT_'[email protected]+' AS
BEGIN
SELECT *
FROM '[email protected]+'.'[email protected]+'
END ;')
FETCH NEXT
FROM AutoProc
INTO @TableSchema,@TableName
END
CLOSE AutoProc
DEALLOCATE AutoProc
END
CLOSE GetDatabases
DEALLOCATE GetDatabases
PS:私はそれがすべてのSQLサーバのユーザのデータベースに適用することができるように「一般的」な手順を記述しようとしているので、私は、データベースの名前を知ることになっていませんよ、私だけではない。
P.S2:ネスティングカーソルを使用しましたが、その悲惨なパフォーマンスのために、私は他の方法にも感謝します!
乾杯!
exec sp_executesql cmdを実行する必要がある行は、そのcmdの実行に対して残りのセッションでは保持されません。そのため、あなたはまだマスターになっています。つまり、「USE dbname」が送信されてから忘れられています。 –
それはデータベース名を知ることが許されていないというのはちょっと変わったようです。もしあなたがマスターにアクセスしてそのコードを実行できるのであれば、それは暗黙のうちに.... :) –
@NickPfitzner私は 'use + DBName'を試みましたが、うまくいきませんでした。何を指示してるんですか? –