您還可以使用Cross apply
SELECT Cname
FROM Tablename
CROSS apply (VALUES('Field1',Field1),
('Field2',Field2),
('Field3',Field3),
('Field4',Field4)) ca (cname, data)
WHERE data = 1
要工作動態使用。
CREATE TABLE test
(
Field1 INT,
Field2 INT,
Field3 INT,
Field4 INT
)
INSERT INTO test
VALUES (1,0,0,1)
DECLARE @collist VARCHAR(max)='',
@sql NVARCHAR(max)
SELECT @collist += '(''' + COLUMN_NAME + ''',' + COLUMN_NAME + '),'
FROM INFORMATION_SCHEMA.columns
WHERE TABLE_NAME = 'test'
AND COLUMN_NAME LIKE 'Field%'
AND TABLE_SCHEMA = 'dbo'
SELECT @collist = LEFT(@collist, Len(@collist) - 1)
SET @sql ='
SELECT Cname
FROM test
CROSS apply (VALUES' + @collist
+ ') ca (cname, data)
WHERE data = 1 '
EXEC Sp_executesql
@sql
這肯定會工作,我感謝您的建議,但我忘了提,我也需要動態地做到這一點對基於給定的標準表。例如。我應該想要查詢我選擇的表並返回名稱以'Field'('Field%')開始並且其值= 1的所有列名稱。 – 2014-12-04 03:15:38
+ One。也許'UNION'會比'UNION ALL'更好,如果OP不希望'Field1'無休止地重複匹配'Field1 = 1'的無盡行。即*列是否在任何行中包含1 *。 – 2014-12-04 03:18:31
@ ta.speot.is。 。 。該OP特別提到該值基於單一記錄。邏輯中需要一個'和recordnum = xxx'。 – 2014-12-04 03:30:46