2009-01-22 187 views
0

是否可以在表上運行選擇以快速找出是否有任何(一個或多個)字段包含特定值?SQL查詢返回其中一個或多個字段包含特定值的所有行

或者你是否必須寫出where子句中的所有列名?

+0

我發誓我昨天看到這個問題,但我找不到它。 – 2009-01-22 21:38:01

+0

給我們提供更多信息。展開您的問題,只需點擊修改並執行即可。 ;) – Stefan 2009-01-22 21:42:02

回答

0

挖這個......它會搜索數據庫中的所有表格,但是可以將其修改爲只有一個表格。

/*This script will find any text value in the database*/ 
/*Output will be directed to the Messages window. Don't forget to look there!!!*/ 

SET NOCOUNT ON 
DECLARE @valuetosearchfor varchar(128), @objectOwner varchar(64) 
SET @valuetosearchfor = '%staff%' --should be formatted as a like search 
SET @objectOwner = 'dbo' 

DECLARE @potentialcolumns TABLE (id int IDENTITY, sql varchar(4000)) 

INSERT INTO @potentialcolumns (sql) 
SELECT 
    ('if exists (select 1 from [' + 
    [tabs].[table_schema] + '].[' + 
    [tabs].[table_name] + 
    '] (NOLOCK) where [' + 
    [cols].[column_name] + 
    '] like ''' + @valuetosearchfor + ''') print ''SELECT * FROM [' + 
    [tabs].[table_schema] + '].[' + 
    [tabs].[table_name] + 
    '] (NOLOCK) WHERE [' + 
    [cols].[column_name] + 
    '] LIKE ''''' + @valuetosearchfor + '''''' + 
    '''') as 'sql' 
FROM information_schema.columns cols 
    INNER JOIN information_schema.tables tabs 
     ON cols.TABLE_CATALOG = tabs.TABLE_CATALOG 
      AND cols.TABLE_SCHEMA = tabs.TABLE_SCHEMA 
      AND cols.TABLE_NAME = tabs.TABLE_NAME 
WHERE cols.data_type IN ('char', 'varchar', 'nvchar', 'nvarchar','text','ntext') 
    AND tabs.table_schema = @objectOwner 
    AND tabs.TABLE_TYPE = 'BASE TABLE' 
ORDER BY tabs.table_catalog, tabs.table_name, cols.ordinal_position 

DECLARE @count int 
SET @count = (SELECT MAX(id) FROM @potentialcolumns) 
PRINT 'Found ' + CAST(@count as varchar) + ' potential columns.' 
PRINT 'Beginning scan...' 
PRINT '' 
PRINT 'These columns contain the values being searched for...' 
PRINT '' 
DECLARE @iterator int, @sql varchar(4000) 
SET @iterator = 1 
WHILE @iterator <= (SELECT Max(id) FROM @potentialcolumns) 
BEGIN 
    SET @sql = (SELECT [sql] FROM @potentialcolumns where [id] = @iterator) 
    IF (@sql IS NOT NULL) and (RTRIM(LTRIM(@sql)) <> '') 
    BEGIN 
     --SELECT @sql --use when checking sql output 
     EXEC (@sql) 
    END 
    SET @iterator = @iterator + 1 
END 

PRINT '' 
PRINT 'Scan completed' 
0

我想你需要列出where子句中的所有列。儘管我遠離SQL嚮導......也許別人知道一種方式。

0

當然,你必須寫出你想用作標準的所有列。

如果您添加您正在使用的編程語言以及您在哪種類型的環境中工作,我們可以爲您提供有關如何動態執行此操作的線索或解決方案。

我認爲你的問題真的是如何動態地做到這一點,取決於你的程序的用戶填寫在「搜索」形式。

如果沒有,那麼..給我們更多的信息。 ;)

3

正如其他人所說的,您可能需要手動或編程將所有列寫入WHERE子句。 SQL不包含直接執行此操作的功能。更好的問題可能是「你爲什麼需要這樣做?」。需要使用這種類型的查詢可能是一個很好的指標,表明您的數據庫不正確normalized。如果你告訴我們你的模式,我們也可以幫助解決這個問題(如果這是一個實際問題)。

相關問題