C# 返回所有包含特定值的列名
我需要帮助来开发一个逻辑(SQL、SP或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个表重复使用相同的代码,这意味着我
ID | A | B | C | D
---------------------------------------
1 |猫和狗| 10?2 | 99 |雄性
2 |鸭| 10和2 | 11 |雌
3 | ????? | &&&& | 0 |男性和女性
如果用户输入&
,则应返回A、B和D列如果用户输入
?
,则应返回A列和B列
其他重要注意事项:
为此,您需要使用动态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);