私のデータベースで使用可能なすべてのテーブルのすべての列をループして、どの列に文字列 "Kroki Homes"が含まれているかをチェックします。ループthrogh特定の文字列を検索するすべてのデータ
私は約。私のデータベースの56テーブル。したがって、これらのテーブルのすべての列をチェックインするのは難しいです。 SQL Serverでこれを実現する簡単な方法はありますか?
私のデータベースで使用可能なすべてのテーブルのすべての列をループして、どの列に文字列 "Kroki Homes"が含まれているかをチェックします。ループthrogh特定の文字列を検索するすべてのデータ
私は約。私のデータベースの56テーブル。したがって、これらのテーブルのすべての列をチェックインするのは難しいです。 SQL Serverでこれを実現する簡単な方法はありますか?
プロシージャを1つ作成して、検索用の文字列を渡すことができます。これがあなたを助けるかもしれない場所をいくつか見つけました。
CREATE PROC [dbo].[SearchDataFromAllTables] (@SearchStr NVARCHAR(100))
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #Results
(
ColumnName NVARCHAR(370),
ColumnValue NVARCHAR(3630)
)
DECLARE @TableName NVARCHAR(256)
, @ColumnName NVARCHAR(128)
, @SearchStr2 NVARCHAR(110)
SET @TableName = ''
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%', '''')
WHILE @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
SET @TableName = (
SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
AND OBJECTPROPERTY(OBJECT_ID(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)), 'IsMSShipped') = 0
)
WHILE (@TableName IS NOT NULL)
AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName = (
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN (
'char'
,'varchar'
,'nchar'
,'nvarchar'
)
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
INSERT INTO #Results
EXEC (
'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630)
FROM ' + @TableName + ' (NOLOCK) ' + ' WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
)
END
END
END
SELECT ColumnName, ColumnValue FROM #Results
END
すべてのテーブルをスキャンするストアドプロシージャを作成する必要があります。
以下のスクリプトは、表と列を示しています。これから、実行中のSQLを作成し、テーブルからのSELECTに対して動的に実行する必要があります。詳細が必要な場合はお知らせください。
SELECT tb.name AS table_name,
c.name AS column_name,
c.column_id,
tp.name AS column_data_type,
c.max_length,
c.precision,
c.scale,
CASE c.is_nullable WHEN 1 THEN 'YES' ELSE 'NO' END AS is_nullable
FROM sys.tables tb,
sys.columns c,
sys.types tp
WHERE tb.object_id = c.object_id
AND SCHEMA_NAME(tb.schema_id) = 'dbo'
AND c.user_type_id = tp.user_type_id
ORDER BY table_name, column_id;
ありがとうRamesh。上の答えで私はinformational_schema.tablesが使用されて参照してくださいあなたの答えで私はsys.tablesを参照してください。これら2つの間に違いはありますか? –
情報スキーマは不完全で、常に信頼できるとは限りません - [INFORMATION_SCHEMAビューに対するケース](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/11/03/the-case-against-information-schema-views .aspx)ですが、ANSI標準と同じように移植性が高くなります。それは本当にあなたが2つの悪のうちの小さいものであると感じるものに依存します。 – GarethD
このリンクを参照してください。https://stackoverflow.com/questions/46187767/difference-between-information-schema-vs-sys-tables-in-sql-server – IamMOHIT
ありがとうございました。それは56のテーブルのすべての列で検索しますか? –
はい。それは:)あなたはそれを試すことができます:) ;) – IamMOHIT