2016-12-13 11 views
0

私はすべてのストアドプロシージャとファンクションを保持するデータベースを持っています'utils'これらのオブジェクトは他のデータベースから呼び出すことができます。ストアドプロシージャにデータベース名を渡す方法

これは、私はいつも理由はspはそうutilsデータベースに属していることである

FROM INFORMATION_SCHEMA.COLUMNS 

を失敗したコードの行があり

USE [Utils] 
GO 
/****** Object: StoredProcedure [dbo].[usp_trim_all_string_columns] Script Date: 13/12/2016 10:54:30 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[usp_trim_all_string_columns] @DatabaseName Varchar(100), @SchemaName Varchar(100),@TableName Varchar(100) 
AS 
BEGIN 

DECLARE @SQL VARCHAR(MAX) 
SELECT @SQL = COALESCE(@SQL + ',[', '[') + 
       COLUMN_NAME + ']=LTRIM(RTRIM([' + COLUMN_NAME + ']))' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = @SchemaName AND TABLE_NAME = @TableName AND DATA_TYPE Like '%char%' 

SET @SQL = 'UPDATE [' + @SchemaName + '].[' + @TableName + '] SET ' + @SQL 

EXEC (@SQL) 

END 

で問題が生じていますストアドプロシージャですutilsスキーマに存在する列のみが検索されます。私はそう

FROM MYDATABASE.INFORMATION_SCHEMA.COLUMNS 

のようにデータベース名を渡すことができますので、私はその行をパラメータ化できるようにする必要があります私は

FROM @DatabaseName.INFORMATION_SCHEMA.COLUMNS 

を使用しようとしたが、@DatabaseNameは単なる文字列であるとして、それは失敗し

どんな人ですか?

+0

申し訳ありませんSQL Serverでは、データベース名やテーブル名などの識別子を変数として渡すことはできません。あなたができることは、[動的SQL](https://msdn.microsoft.com/en-us/library/ms188001.aspx?f=255&MSPPError=-2147217396)をビルドして実行することです。あるいは、@ IvanStarostinの助言に従って、SPのコピーをすべてのデータベースに置くこともできます。 2つのアプローチのうち、私は後者を好むが、あなたの設定についてもっと知ることなく、一方のアプローチを他のものよりも推奨するのは難しい。 –

答えて

1

スプレッド全てのDB、このSP:

exec master.sys.sp_MSforeachdb 'USE [?]; exec usp_trim_all_string_columns;' 

またはそれが完全に定義されたDBで動的SQLは、動的SQLをinsedする書き換えます。

+0

新しいデータベースを作成するたびにそのコマンドを実行する必要がありますか? – totalitarian

+0

私はそれを取得しません。あなたはあなたがそうする必要があると思うときにそれを実行しなければならないでしょう。 –

+0

システムデータベースも無視できます – TheGameiswar

関連する問題