1

このスニペットを使用して、データベースの任意のテーブルで特定の文字列を見つけています!

DECLARE @searchstring  NVARCHAR(255)
SET @searchstring = '%foo%'

DECLARE @sql NVARCHAR(max)

SELECT @sql = STUFF((
    SELECT ' UNION ALL SELECT ' + COLUMN_NAME + ' ' +
    ' FROM ' + TABLE_NAME + 
    ' WHERE ' + COLUMN_NAME + ' LIKE ''' + @searchstring + ''''
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE DATA_TYPE in ('nvarchar', 'varchar', 'char','nchar')
    FOR XML PATH('')
) ,1, 11, '')


exec (@sql)

しかし、これらのエントリの主キーの値を取得したいと思います!

使用する特定のテーブルの主キーを取得するには

SELECT ccu.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc 
    INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name 
    WHERE tc.CONSTRAINT_TYPE = 'Primary Key' 
    AND tc.TABLE_NAME = 'tbl_table'

しかし、両方を組み合わせることはできませんか?!

4

1 に答える 1

0

主キーに複数の列を持つ表もあれば、主キーを持たない表もあります。そのため、このタスクは少し難しくなり、結果の列は 1 つの列の主キー値のリストである必要があります。

SELECT @sql = STUFF((
    SELECT ' UNION ALL SELECT ' + QUOTENAME(C.COLUMN_NAME) + ', ' +
               ISNULL(STUFF((SELECT '+'', ''+CAST('+QUOTENAME(COLUMN_NAME)+' AS VARCHAR(MAX))'
                             FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
                               INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS CU
                                 ON TC.CONSTRAINT_NAME = CU.CONSTRAINT_NAME AND
                                    TC.TABLE_NAME = CU.TABLE_NAME
                             WHERE CU.TABLE_NAME = C.TABLE_NAME AND
                                   TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
                             FOR XML PATH('')), 1, 6, ''), '''''')+' AS PrimaryKeys'+
    ' FROM ' + QUOTENAME(C.TABLE_NAME) + 
    ' WHERE ' + QUOTENAME(C.COLUMN_NAME) + ' LIKE ''' + @searchstring + ''''
    FROM INFORMATION_SCHEMA.COLUMNS AS C
    WHERE C.DATA_TYPE in ('nvarchar', 'varchar', 'char','nchar')
    ORDER BY C.TABLE_NAME
    FOR XML PATH('')
) ,1, 11, '')

SQL フィドル

フィドルでテーブルを使用すると、生成されたクエリは次のようになります。

SELECT [Col], 
       CAST([ID] AS VARCHAR(MAX)) AS PrimaryKeys 
FROM [T1] 
WHERE [Col] LIKE '%foo%' 
UNION ALL 
SELECT [Col], 
       CAST([Col] AS VARCHAR(MAX))+', '+CAST([ID] AS VARCHAR(MAX)) AS PrimaryKeys 
FROM [T2] 
WHERE [Col] LIKE '%foo%' 
UNION ALL 
SELECT [Col], 
       '' AS PrimaryKeys 
FROM [T3] 
WHERE [Col] LIKE '%foo%'
于 2013-08-08T09:49:04.680 に答える