Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 返回所有包含特定值的列名_C#_Sql_Sql Server_Stored Procedures - Fatal编程技术网

C# 返回所有包含特定值的列名

C# 返回所有包含特定值的列名,c#,sql,sql-server,stored-procedures,C#,Sql,Sql Server,Stored Procedures,我需要帮助来开发一个逻辑(SQL、SP或C#),它将返回所有具有用户指定值的列名 例如: ID | A | B | C | D --------------------------------------- 1 |猫和狗| 10?2 | 99 |雄性 2 |鸭| 10和2 | 11 |雌 3 | ????? | &&&& | 0 |男性和女性 如果用户输入&,则应返回A、B和D列 如果用户输入?,则应返回A列和B列 其他重要注意事项: 我必须对其他80个表重复使用相同的代码,这意味着我

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

例如:

ID | A | B | C | D
---------------------------------------
1 |猫和狗| 10?2 | 99 |雄性
2 |鸭| 10和2 | 11 |雌
3   | ?????   | &&&& | 0 |男性和女性
如果用户输入
&
,则应返回A、B和D列
如果用户输入
,则应返回A列和B列

其他重要注意事项:

  • 我必须对其他80个表重复使用相同的代码,这意味着我不能在逻辑中硬编码列名
  • 每个表中至少有500列和10000行—性能是一个大问题
  • 编辑:用户可以输入多个字符。i、 他可以输入“ck”返回A列,因为“duck”中有“ck”


    为此,您需要使用动态SQL。您是否熟悉
    sp_executesql()
    (或
    exec()
    )?@GordonLinoff不太熟悉…如果用户输入数字1,您是否希望看到B列和C列?还是仅仅是C?我问这个问题的原因是因为B看起来像一个
    (VAR)CHAR
    ,而C看起来像一个
    INT
    。我认为您需要决定如何处理“数字”与“字符串”类型的数据,以免数据变得太深。@DMason您问得好。除了ID之外,所有列都是varchar。我不需要从ID(主键)返回任何内容column@DMason对于混淆的部分很抱歉,在给出示例数据时,我没有考虑数据类型。但它们都是Varchar/String
    --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);