SQL Server 2008を使用して、80列のtesting
というテーブルがあり、foo
という値を見つけたいとします。
できます:
SELECT *
FROM testing
WHERE COLNAME = 'foo'
80列すべてにクエリを実行し、foo
が80列のいずれかに含まれるすべての結果を返すことができますか?
前もって感謝します。
最初のメソッド(テスト済み)最初にコンマで区切られた文字列変数の列のリストを取得し、IN
を使用してその変数を使用して 'foo'を検索できます
最初に列を取得し、次に文字列を検索するストアドプロシージャを確認します。
DECLARE @TABLE_NAME VARCHAR(128)
DECLARE @SCHEMA_NAME VARCHAR(128)
-----------------------------------------------------------------------
-- Set up the name of the table here :
SET @TABLE_NAME = 'testing'
-- Set up the name of the schema here, or just leave set to 'dbo' :
SET @SCHEMA_NAME = 'dbo'
-----------------------------------------------------------------------
DECLARE @vvc_ColumnName VARCHAR(128)
DECLARE @vvc_ColumnList VARCHAR(MAX)
IF @SCHEMA_NAME =''
BEGIN
PRINT 'Error : No schema defined!'
RETURN
END
IF NOT EXISTS (SELECT * FROM sys.tables T JOIN sys.schemas S
ON T.schema_id=S.schema_id
WHERE T.Name=@TABLE_NAME AND S.name=@SCHEMA_NAME)
BEGIN
PRINT 'Error : The table '''+@TABLE_NAME+''' in schema '''+
@SCHEMA_NAME+''' does not exist in this database!'
RETURN
END
DECLARE TableCursor CURSOR FAST_FORWARD FOR
SELECT CASE WHEN PATINDEX('% %',C.name) > 0
THEN '['+ C.name +']'
ELSE C.name
END
FROM sys.columns C
JOIN sys.tables T
ON C.object_id = T.object_id
JOIN sys.schemas S
ON S.schema_id = T.schema_id
WHERE T.name = @TABLE_NAME
AND S.name = @SCHEMA_NAME
ORDER BY column_id
SET @vvc_ColumnList=''
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @vvc_ColumnName
WHILE @@FETCH_STATUS=0
BEGIN
SET @vvc_ColumnList = @vvc_ColumnList + @vvc_ColumnName
-- get the details of the next column
FETCH NEXT FROM TableCursor INTO @vvc_ColumnName
-- add a comma if we are not at the end of the row
IF @@FETCH_STATUS=0
SET @vvc_ColumnList = @vvc_ColumnList + ','
END
CLOSE TableCursor
DEALLOCATE TableCursor
-- Now search for `foo`
SELECT *
FROM testing
WHERE 'foo' in (@vvc_ColumnList );
2番目のメソッド SQLサーバーでは、テーブルのオブジェクトIDを取得でき、そのオブジェクトIDを使用して列をフェッチできます。その場合、次のようになります。
ステップ1:最初にテーブルのオブジェクトIDを取得
select * from sys.tables order by name
ステップ2:テーブルの列を取得して検索します:
select * from testing where 'foo' in (select name from sys.columns where object_id =1977058079)
注:object_idは、関連するテーブルの最初のステップで取得するものです
in
を使用できます:
SELECT *
FROM testing
WHERE 'foo' in (col1, col2, col3, . . . );
Inを使用し、sql文字列を作成してexecute sp_executesql
を使用して実行することで、列名を動的に取得し、IN
句に渡すことができます。
declare @sql nvarchar(2100)
declare @cols nvarchar(2000)
declare @toSearch nvarchar(200)
declare @tableName nvarchar(200)
set @tableName = 'tbltemp'
set @toSearch = '5'
set @cols =(
SELECT LEFT(column_name, LEN(column_name) - 1)
FROM (
SELECT column_name + ', '
FROM INFORMATION_SCHEMA.COLUMNS where table_name = @tableName
FOR XML PATH ('')
) c (column_name )
)
set @sql = 'select * from tbltemp where '''+ @toSearch + ''' in (' + @cols + ')';
execute sp_executesql @sql
私は、Usaid Ashrafの回答からこのアイデアを取り入れましたが、実際に機能するようにしました。ここでMyTableNameを変更するだけです。
SELECT STUFF((
SELECT ', ' + c.name
FROM sys.columns c
JOIN sys.types AS t ON c.user_type_id=t.user_type_id
WHERE t.name != 'int' AND t.name != 'bit' AND t.name !='date' AND t.name !='datetime'
AND object_id =(SELECT object_id FROM sys.tables WHERE name='MyTableName')
FOR XML PATH('')),1,2,'')
ニーズに合わせて微調整し、where列の条件を追加または削除することができます( 't.name!=' int 'AND t.name!=' bit 'などの部分)。 't.name!=' uniqueidentifier ''を追加して、Conversion failed when converting the varchar value 'myvalue' to data type int
エラーのタイプ。
次に、copy pasteこのクエリへの結果(それ以外の場合は機能しませんでした):
SELECT * from MyTableName where 'foo' in (COPY PASTE PREVIOUS QUERY RESULT INTO HERE)
これが最善の方法の一つだと思う
SELECT * FROM sys.columns a
inner join
(
SELECT object_id
FROM sys.tables
where
type='U'--user table
and name like 'testing'
) b on a.object_id=b.object_id
WHERE a.name like '%foo%'