我有一个特定的字符串,例如“ 123abcd”,但我不知道表的名称,甚至不知道SQL Server数据库中表内的列的名称。我想通过选择找到它并显示相关字符串的所有列,所以我想知道以下内容:
select * from Database.dbo.* where * like '%123abcd%'
出于显而易见的原因,它不起作用,但是有一种简单的方法可以创建一个select语句来执行类似的操作?
这将起作用:
DECLARE @MyValue NVarChar(4000) = 'something'; SELECT S.name SchemaName, T.name TableName INTO #T FROM sys.schemas S INNER JOIN sys.tables T ON S.schema_id = T.schema_id; WHILE (EXISTS (SELECT * FROM #T)) BEGIN DECLARE @SQL NVarChar(4000) = 'SELECT * FROM $$TableName WHERE (0 = 1) '; DECLARE @TableName NVarChar(1000) = ( SELECT TOP 1 SchemaName + '.' + TableName FROM #T ); SELECT @SQL = REPLACE(@SQL, '$$TableName', @TableName); DECLARE @Cols NVarChar(4000) = ''; SELECT @Cols = COALESCE(@Cols + 'OR CONVERT(NVarChar(4000), ', '') + C.name + ') = CONVERT(NVarChar(4000), ''$$MyValue'') ' FROM sys.columns C WHERE C.object_id = OBJECT_ID(@TableName); SELECT @Cols = REPLACE(@Cols, '$$MyValue', @MyValue); SELECT @SQL = @SQL + @Cols; EXECUTE(@SQL); DELETE FROM #T WHERE SchemaName + '.' + TableName = @TableName; END; DROP TABLE #T;
不过,有几点警告。首先, 这是极其缓慢且未优化的 。所有值都将被nvarchar简单地转换,以便可以比较它们而不会出错。您可能会遇到一些问题,例如datetime无法按预期方式转换值,因此在应有的值不匹配时(假否定)。
nvarchar
datetime
使用WHERE (0 = 1)可以OR简化子句的构建。如果没有匹配项,则不会返回任何行。
WHERE (0 = 1)
OR