返回所有列名称包含特定值

时间:2014-03-11 16:29:11

标签: c# sql sql-server stored-procedures

我需要帮助来开发一个逻辑(SQL,SP或C#),它将返回具有用户指定值的所有列名。

例如:

ID  | A       | B    | C  | D
---------------------------------------
1   | cat&dog | 10?2 | 99 | male
2   | duck    | 10&2 | 11 | female
3   | ?????   | &&&& | 0  | male&female

如果用户输入&,则应返回A,B和D列 如果用户输入?,则应返回A列和B列

其他重要说明:

  1. 我必须为其他80个表重用相同的代码,这意味着我无法在逻辑中对列名进行硬编码。
  2. 每张表中至少有500列和10,000行 - 性能是一个很大的问题。
  3.   
        

    已编辑:用户可以输入多个字符。即他可以输入“ck”,它将返回A列,因为“duck”中有“ck”。

      

1 个答案:

答案 0 :(得分:1)

--Test table.
CREATE TABLE guest.Test (
    ID INT IDENTITY CONSTRAINT PK_Test PRIMARY KEY,
    ColA VARCHAR(32),
    ColB VARCHAR(32),
    ColC VARCHAR(32),
    ColD VARCHAR(32),

    --Non-VARCHAR cols as invalid data for testing.
    ColX INT,
    ColY DATETIME
);

--Sample data.
INSERT INTO guest.Test (ColA, ColB, ColC, ColD, ColX, ColY)
VALUES
    ('cat&dog', '10?2', '99', 'male', 1, CURRENT_TIMESTAMP),
    ('duck', '10&2', '11', 'female', 2, CURRENT_TIMESTAMP + 2),
    ('?????', '&&&&', '0', 'male&female', 9, CURRENT_TIMESTAMP + 5);

----------------------------------------------------------------------
--Here is the template for a stored proc.
----------------------------------------------------------------------
--These first three could be your SP parameters.
DECLARE @UserInput NVARCHAR(160) = 'ck';
DECLARE @SchemaName SYSNAME = 'guest';
DECLARE @TableName SYSNAME = 'Test';

DECLARE @Tsql NVARCHAR(MAX) = '';

SELECT @Tsql = @Tsql + 'SELECT ''' + c.COLUMN_NAME + ''' AS ColumnName WHERE EXISTS (SELECT 1 FROM [' + c.TABLE_SCHEMA + '].[' + c.TABLE_NAME + '] WHERE [' + c.COLUMN_NAME + '] LIKE ''%' + @UserInput + '%'') UNION ALL '
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_SCHEMA = @SchemaName
AND c.TABLE_NAME = @TableName
--"String" data types.  Did I leave any out?
AND c.DATA_TYPE IN ('CHAR', 'NCHAR', 'VARCHAR', 'NVARCHAR')
--Exclude PRIMARY KEY column(s)
AND c.COLUMN_NAME NOT IN (
    SELECT kcu.COLUMN_NAME
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
    JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
        ON kcu.TABLE_SCHEMA = tc.TABLE_SCHEMA
        AND kcu.TABLE_NAME = tc.TABLE_NAME
    WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
    AND tc.TABLE_SCHEMA = @SchemaName
    AND tc.TABLE_NAME = @TableName
);

--Remove last "UNION ALL" from string.
SET @Tsql = LEFT(@Tsql, LEN(@Tsql) - 9);

PRINT @Tsql;

--Uncomment when ready to proceed.
--EXEC (@Tsql);