【发布时间】:2009-01-22 21:30:36
【问题描述】:
是否可以在表格上运行选择以快速找出任何(一个或多个)字段是否包含特定值?
或者您是否必须在 where 子句中写出所有列名?
【问题讨论】:
-
我发誓我昨天看到了这个问题,但我找不到。
-
给我们更多信息。展开您的问题,只需单击编辑并执行此操作。 ;)
标签: sql
是否可以在表格上运行选择以快速找出任何(一个或多个)字段是否包含特定值?
或者您是否必须在 where 子句中写出所有列名?
【问题讨论】:
标签: sql
正如其他人所说,您可能必须手动或以编程方式将所有列写入 WHERE 子句。 SQL 不包含直接执行此操作的功能。一个更好的问题可能是“你为什么需要这样做?”。需要使用这种类型的查询可能是一个很好的指标,表明您的数据库不正确normalized。如果您告诉我们您的架构,我们也可以帮助解决该问题(如果这是一个实际问题)。
【讨论】:
挖掘这个...它将搜索数据库中的所有表,但您可以将其修改为仅一个表。
/*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'
【讨论】:
我认为您需要列出 where 子句中的所有列。不过,我离 SQL 向导还很远……也许其他人知道方法。
【讨论】:
你必须写出来
【讨论】:
当然,你必须写出你想用作标准的所有列。
如果您添加您正在使用的编程语言以及您在什么类型的环境中工作,我们可以为您提供如何动态执行此操作的线索或解决方案。
我认为您的问题实际上是如何根据您的程序用户在“搜索”表单中填写的内容动态地执行此操作。我对吗?
如果没有,那么.. 给我们更多信息。 ;)
【讨论】: