我需要帮助来开发一个逻辑(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列
其他重要说明:
已编辑:用户可以输入多个字符。即他可以输入“ck”,它将返回A列,因为“duck”中有“ck”。
答案 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);