MS SqlServer上の任意のデータベースの任意のテーブルで実行できるストアドプロシージャがあります。 EXECステートメントとUSEステートメントの組み合わせのほとんどは、何も生じませんでした。ストアドプロシージャは次のとおりです。
CREATE PROCEDURE [dbo].[usp_TrimAndLowerCaseVarcharFields]
(
@Database VARCHAR(200),
@TableSchema VARCHAR(200),
@TableName VARCHAR(200)
)
AS
BEGIN
DECLARE @sSql VARCHAR(MAX)
SET @Database = '[' + @Database + ']'
SET @sSql = ''
-- Create first part of a statement to update all columns that have type varchar
SELECT @sSql = @sSql + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')), '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'varchar'
AND TABLE_CATALOG = @Database
AND TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @TableName
SET @sSql = 'UPDATE ' + @Database + '.' + @TableSchema + '.' + @TableName + ' SET ' + @sSql
-- Delete last two symbols (', ')
SET @sSql = LEFT(@sSql, LEN(@sSql) - 1)
EXEC(@sSql)
END
[OtherDB]。[TargetTable]で実行するために私がしなければならないことをアドバイスしてください。
テーブルとストアドプロシージャの両方を完全に修飾できます。言い換えれば、あなたはこれを行うことができます:
UPDATE [OtherDB].[Schema].[targetTable] SET ...
すでにprocでこれを行っているようです。
完全修飾名を使用してストアドプロシージャをEXECすることもできます-例:.
EXEC [OtherDB].[dbo].[usp_TrimAndLowerCaseVarcharFields]
正直なところ、procは正常に見えますが、エラーメッセージが表示されていますか?もしそうなら、それらを投稿してください。また、ユーザーが他のDBにアクセスできることを確認してください。
使用したクエリのテーブル名が間違っています。同じデータベースを検索していますが、別のデータベースから検索する必要があります。したがって、クエリは次のようになります。
SELECT @sSql = @sSql + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')), '
FROM [TargetDB].INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'varchar'
AND TABLE_CATALOG = @Database
AND TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @TableName
-- [TargetDB] = @Database
TargetDBは、渡すデータベース(@Database)と同じになります
[TargetDB]を動的に使用する場合は、sql(@sSql)を生成し、sql文字列を実行する必要があります。
この場合、SQLServerで2つのspを使用することをお勧めします。
sp_MSforeachtable
sp_MSforeachdb
詳細については、 ここ の記事をお読みください。この助けを願っています。
exec @RETURN_VALUE=sp_MSforeachtable @command1, @replacechar, @command2,
@command3, @whereand, @precommand, @postcommand
exec @RETURN_VALUE = sp_MSforeachdb @command1, @replacechar,
@command2, @command3, @precommand, @postcommand
完全なスクリプト:
declare @DatabaseName varchar(max), @DatabaseCharParam nchar(1)
declare @TableSchema varchar(max)
declare @TableName varchar(max), @TableCharParam nchar(1)
set @DatabaseName='DATABASENAME'; set @DatabaseCharParam='?'
set @TableSchema='dbo'
set @TableName='TABLENAME'; set @TableCharParam='$'
-- Exemple Script to execute in each table in each database
-- Create first part of a statement to update all columns that have type varchar
DECLARE @sSql VARCHAR(MAX)
set @sSql=''
SELECT @sSql = isnull(@sSql,'') + COLUMN_NAME + ' = LOWER(RTRIM(' + COLUMN_NAME + ')),'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'varchar'
AND TABLE_CATALOG = @DatabaseName
AND TABLE_SCHEMA = @TableSchema
AND TABLE_NAME = @TableName
declare @EachTablecmd1 varchar(2000)
--Prepare @EachTablecmd1 the script to execution in each table using sp_MSforeachtable (ATENTION: @Command1 are limited to varchar(2000) )
--in sp_MSforeachtable @TableCharParam will be subtituted with owner i.e:[dbo].[TABLENAME]
set @sSql='update '+@TableCharParam+' set '+ left(@sSql,LEN(@sSql)-1)
set @EachTablecmd1='if '''''+ @TableCharParam +'''''=''''['+@TableSchema+'].['+@TableName+']'''' '+@sSql
--i.e.: if 'table1'='table1' update table1 set column1=LOWER(RTRIM(column1)),....
-- the @sSql for each table in a database
set @sSql ='exec sp_MSforeachtable @command1='''+@EachTablecmd1+''' ,@replacechar='''+@TableCharParam+''''
declare @EachBDcmd1 varchar(2000)
--Prepare the execution to each database using sp_MSforeachdb (ATENTION: @Command1 are limited to varchar(2000) )
set @EachBDcmd1='if '''+@DatabaseCharParam+'''='''+@DatabaseName+''' '+ @sSql
--print @EachBDcmd1
exec sp_MSforeachdb @command1=@EachBDcmd1,@replacechar=@DatabaseCharParam