2

を使用してsp_MSForeachtable、すべてのテーブルの列名を取得し、列名を単一の文字列に連結しています。次のクエリを使用しています。単一のテーブルの変数を介してパラメーターを提供して同じことを実行しましたが、完全に機能しますが、SP から実行すると、「マルチパート識別子 "dbo.TableNm" をバインドできませんでした」というエラーで失敗します。

DECLARE @query nvarchar(max)
SELECT  @query = 

'DECLARE @Names VARCHAR(255)  
DECLARE @DB VARCHAR(255)

SELECT @Names = COALESCE(@Names + '', '', '''') + COLUMN_NAME FROM Information_Schema.COLUMNS
WHERE TABLE_NAME = ?

SELECT TOP 1  @DB = TABLE_CATALOG FROM Information_Schema.COLUMNS
WHERE TABLE_NAME = ?

SELECT @DB AS [DataBase], ? AS [Table], @Names AS [Columns]'

EXEC sp_MSforeachtable @query

エラーは、異なるデータベースに同じ名前の複数のテーブルがあることに関連している可能性があると考えたため、データベースを事前に修正しようとしましたが、それでも同じエラーが発生します。

DECLARE @query nvarchar(max)
SELECT  @query = 

'DECLARE @Names VARCHAR(255)  
DECLARE @DB VARCHAR(255)
DECLARE @TableNm VARCHAR(255) = ?

SET @DB = ''People_Directory''

SELECT @Names = COALESCE(@Names + '', '', '''') + COLUMN_NAME FROM Information_Schema.COLUMNS
WHERE TABLE_NAME = @TableNm
AND TABLE_CATALOG = @DB

SELECT @DB AS [DataBase], @TableNm AS [Table], @Names AS [Columns]'


EXEC sp_MSforeachtable @query

まだまだ頑張りますが、アイデアが尽きてしまいました。何かご意見は?

4

1 に答える 1

0

クエリ内の?は、テーブルの引用符で囲まれたスキーマ修飾名に置き換えられます。引用符で囲まれないため、クエリは次のようになります。

SELECT ...
WHERE TABLE_NAME = [dbo].[YourTable]
...
SELECT @DB As [DataBase], [dbo].[YourTable] As [Table], @Names As [Columns]

これは明らかにエラーを生成します。

?文字列として扱われるように、前後に引用符を追加する必要があります。ただし、列にスキーマ名が含まれておらず、引用されていないため、クエリは引き続き機能しません。TABLE_NAME

クエリを期待どおりに機能させるには、現在のテーブル名と比較する前に、列TABLE_SCHEMATABLE_NAME列を結合し、値が引用符で囲まれていることを確認する必要があります。

DECLARE @query nvarchar(max)
SELECT  @query = 

'DECLARE @Names VARCHAR(255)  
DECLARE @DB VARCHAR(255)

SELECT @Names = COALESCE(@Names + '', '', '''') + COLUMN_NAME FROM Information_Schema.COLUMNS
WHERE QUOTENAME(TABLE_SCHEMA) + ''.'' + QUOTENAME(TABLE_NAME) = ''?''

SELECT TOP 1  @DB = TABLE_CATALOG FROM Information_Schema.COLUMNS
WHERE QUOTENAME(TABLE_SCHEMA) + ''.'' + QUOTENAME(TABLE_NAME) = ''?''

SELECT @DB AS [DataBase], ''?'' AS [Table], @Names AS [Columns]'

EXEC sp_MSforeachtable @query

編集:
これ を行うために実際に使用sp_MSforeachtableする必要はありません。この記事のいずれかの方法を使用して、1つのクエリでこの情報を取得できます。

SELECT
    T.TABLE_CATALOG As [DataBase],
    QUOTENAME(T.TABLE_SCHEMA) + '.' + QUOTENAME(T.TABLE_NAME) As [Table],
    STUFF(
        (
            SELECT ', ' + COLUMN_NAME
            FROM INFORMATION_SCHEMA.COLUMNS As C
            WHERE C.TABLE_CATALOG = T.TABLE_CATALOG
            And C.TABLE_SCHEMA = T.TABLE_SCHEMA
            And C.TABLE_NAME = T.TABLE_NAME
            ORDER BY C.ORDINAL_POSITION
            FOR XML PATH(''), TYPE
        ).value('.', 'varchar(max)')
    , 1, 1, '') As [Columns]
FROM
    INFORMATION_SCHEMA.TABLES As T
;
于 2014-08-07T16:09:21.343 に答える