在不知道列

时间:2017-02-07 06:17:57

标签: sql-server sql-server-2008

注意:这是询问

  1. 如何选择已知列名称的字符串。
  2. 如何在所有表格中选择字符串(所有Google搜索结果与此相关)
  3. 这只是在 ONE 表中进行搜索。

    SQL返回错误信息conversion failed when converting the nvarchar value S3N2V5

    我想找到S3N2V5存在的列名。

    请不要手动方法。有1000000列。

    输入S3N2V5

    输出columnname1ofthistable

3 个答案:

答案 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轻松搜索内容。