我有一张桌子" ExcelData"如下所示:
Id [Title 1] [Title 2] [Address 1] [Address 2] City State
1 A1 A2 add1 add2 X Y
2 B1 B2 add1 add2 X Y
我需要一个字符串形式的查询,在检查每个列是否存在于表中后,从上表中获取结果。
Declare @strSQL nvarchar(max), @RecId int
set @RecId = 1
--- while循环将存在于@Count变量中。我的疑问是:
set @strSQL = 'SELECT CASE WHEN EXISTS(SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ExcelData' and COLUMN_NAME='[Title ' + CONVERT(nvarchar(10), @Count)) THEN(SELECT '[Title ' + CONVERT(nvarchar(10), @Count)]'
FROM ExcelData where ExcelData.Id = '+ @RecId +') ELSE NULL END AS [Title]
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='ExcelData' and COLUMN_NAME='[Email]' THEN(SELECT '[Email]' FROM ExcelData where ExcelData.Id = '+ @RecId +') ELSE NULL END AS [Email])'
Execute(@strSQL)
如果表中存在列,那么我需要结果,如果不存在,那么查询应该在列值中返回null,如下所示:
期望的结果:
[Title 1] [Title 2] [Email]
A1 A2 NULL
但我没有得到理想的结果。
答案 0 :(得分:1)
这应该动态地获取[Title 1],[Title 2],[Email]列的值(如果它们存在),并在@RecId上有一个循环。如果您可以有多个Title / Address列,则还应该实现@Count变量。
DECLARE @strSQL nvarchar(max),
@RecId int
SET @RecId = 1
WHILE EXISTS (SELECT TOP 1 1 FROM ExcelData WHERE Id = @RecId)
BEGIN
SET @strSQL = '
SELECT '+
(case when exists (select *
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'ExcelData' and
column_name = 'Title 1'
)
then '[Title 1]'
else 'NULL AS [Title 1]'
end) + ', ' +
(case when exists (select *
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'ExcelData' and
column_name = 'Title 2'
)
then '[Title 2]'
else 'NULL AS [Title 2]'
end) + ', ' +
(case when exists (select *
from INFORMATION_SCHEMA.COLUMNS
where table_name = 'ExcelData' and
column_name = 'Email'
)
then '[Email]'
else 'NULL AS Email'
end) + '
FROM ExcelData
WHERE Id = ' + CAST(@RecId AS varchar(50))
EXEC sp_executesql @strSQL
SET @RecId = @RecId + 1
END
结果是:
Title 1 Title 2 Email
A1 A2 NULL
Title 1 Title 2 Email
B1 B2 NULL