0

複数のデータベース間で単純なselectステートメントの結果を動的に結合するコードを正常に記述しました。各レコードを識別できるように、データベース名自体をフィールドとして含めたいと思います。それを達成するために以下のコードを変更する最良の方法は何ですか?

私の現在の結果は次のようになります

field2、field3、field4 b、c、d 2,3,4

(b、c、d)を含む行がどのデータベースから来ているのかわかりません。

そして、field1、field2、field3、field4 First_DatabaseName、b、c、d Second_DatabaseName、2,3,4が表示されていることを確認したいと思います。

上記では、(b、c、d)を含む行がFirst_Databaseからのものであることがわかりました。

DECLARE @sql varchar(max)

SELECT @sql = ISNULL(@sql + 'union all ',' ') + ' SELECT * FROM ' + name + '.dbo.CombinedProvider '
FROM   sys.databases
WHERE  name in ('First_DatabaseName', 'Second_DatabaseName')

EXEC (@sql)
4

2 に答える 2

2

使用しているサブクエリに名前を追加するだけです。

SELECT @sql = COALESCE(@sql + 'union all ',' ') + ' SELECT '''+name+''' as dbname, c.* FROM ' + name + '.dbo.CombinedProvider c'
FROM   sys.databases
WHERE  name in ('First_DatabaseName', 'Second_DatabaseName')

ちなみに、サポートされていない手法を使用して、集計文字列の連結を行っています。別の手法として、「for xmlpath('')」について学習することをお勧めします。このテーマについて知りたい以上の情報については、http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/を確認してください。

于 2012-04-13T19:05:16.147 に答える
0

各列の後に「AS」を使用し、ソースデータベース名を列に含めます。

DECLARE @sql varchar(max)

SELECT @sql = ISNULL(@sql + 'union all ',' ') + ' SELECT ColName as [First_DatabaseName_ColName], ColName2 as [Second_DatabaseName_ColName2], FROM ' + name + '.dbo.CombinedProvider '
FROM   sys.databases
WHERE  name in ('First_DatabaseName', 'Second_DatabaseName')

EXEC (@sql)
于 2012-04-12T17:45:14.307 に答える