注意:这是不询问
这只是在 ONE 表中进行搜索。
SQL返回错误信息conversion failed when converting the nvarchar value S3N2V5
。
我想找到S3N2V5
存在的列名。
请不要手动方法。有1000000列。
输入S3N2V5
输出columnname1ofthistable
答案 0 :(得分:1)
假设我理解了这个问题,这里有一种方法可以使用CASE
从单个表中获取包含搜索值的所有列的列表:
创建并填充样本表(请在将来的问题中保存此步骤)
CREATE TABLE T
(
COL1 char(3),
COL2 char(3),
COL3 char(3),
COL4 int
)
INSERT INTO T VALUES
('abc', 'def', 'nop', 1),
('klm', 'nop', 'qrs', 2),
('tuv', 'wzy', 'zab', 3)
构建动态sql:
DECLARE @Search nvarchar(5) = 'nop'
DECLARE @SQL nvarchar(max) = 'SELECT CASE @Search'
SELECT @SQL = @SQL +' WHEN '+ COLUMN_NAME + ' THEN '''+ COLUMN_NAME +''''
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'T'
AND LOWER(DATA_TYPE) LIKE '%char%' -- only search char, varchar, nchar and nvarchar columns
SELECT @SQL = 'SELECT ColumnName FROM (' +
@SQL + ' END As ColumnName FROM T) x WHERE ColumnName IS NOT NULL'
执行:(请注意,使用sp_executeSQL是SQL注入安全的,因为我们不将搜索参数连接到查询中,而是将其用作参数)
EXEC sp_executeSQL @SQL, N'@Search nvarchar(5)', @Search
结果:
ColumnName
COL3
COL2
答案 1 :(得分:0)
DECLARE @MyValue NVarChar(4000) = 'searchstring';
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;
select substring(@SQL,charindex('.',@SQL)+1,charindex('(',@SQL)-charindex('.',@SQL)-8) as 'TableName'
EXECUTE(@SQL);
DELETE FROM #T
WHERE SchemaName + '.' + TableName = @TableName;
END;
DROP TABLE #T;
这将为您提供表名和表中包含searchstring的整行。
答案 2 :(得分:0)
除了帖子中提到的anwswers:Older Post
1)(使用列名)SELECT table_name,table_schema FROM INFORMATION_SCHEMA.COLUMNS WHERE column_name =' sort_method';
我希望你能更好地采用dump(in.sql格式),并且可以使用像N ++这样的IDE轻松搜索内容。