您可以使用这样的查询(需要STUFF 删除前导逗号
):
SELECT ID,
STUFF(
CONCAT(CASE WHEN Test1 IS NULL THEN ',Test1' END,
CASE WHEN Test2 IS NULL THEN ',Test2' END,
CASE WHEN Test3 IS NULL THEN ',Test3' END
), 1, 1, '') as InvalidColumns
FROM table1 WHERE Test1 IS NULL OR Test2 IS NULL OR Test3 IS NULL;
如果您想使查询动态化,请使用以下查询:
DECLARE @table AS NVARCHAR(MAX),
@cols1 AS NVARCHAR(MAX),
@cols2 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SET @table = 'Table1'
SET @cols1 = STUFF((SELECT distinct ',CASE WHEN ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL THEN '',' + c.COLUMN_NAME + ''' END'
FROM INFORMATION_SCHEMA.columns c
WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @cols2 = STUFF((SELECT distinct 'OR ' + QUOTENAME(c.COLUMN_NAME) + ' IS NULL '
FROM INFORMATION_SCHEMA.columns c
WHERE TABLE_SCHEMA = 'dbo' and TABLE_NAME = @table And COLUMN_NAME <> 'Id'
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,3,'')
SET @query = N'SELECT ID, STUFF(CONCAT(' + @cols1 + '), 1, 1, '''') as InvalidColumns FROM ' + @table + ' WHERE ' + @cols2
--SELECT @cols1, @cols2, @query
EXEC sp_executesql @query
它产生以下结果:
| ID | INVALIDCOLUMNS |
|----|----------------|
| 5 | Test3 |
| 7 | Test1,Test3 |
SQL Fiddle