Raz*_*arp 9 sql t-sql sql-server null
好的,4个小时的编码,只有6个小时的搜索......我并没有比开始时更好.这是我的问题.我有一个表(tmpShell),它有12列.它是一个没有约束的基本表 - 用于临时报告.当我们插入数据时,我必须提取一个ID号(PatientId)和所有列NAMES,其中该PatientId的值为null.
例:
PatientId Fname Lname DOB 123455 Sam NULL NULL
2345455 NULL Doe 1/1/1980
09172349 John Jone NULL
我想要回归的是:
PatientId ErrorMsg 123455 Lname,DOB
2345455 Fname
09172349 DOB
当然,如果所有列都有值,则errormsg将为null.
我已尝试并失败了大约300个不同的代码片段,但这似乎是我能得到的最接近的代码.不幸的是,这只返回每一列,而不是空值.
ALTER PROC [sp_aaShowAllNullColumns]
@tableName VARCHAR(255)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(4000);
DECLARE @cols NVARCHAR(4000);
DECLARE @tcols TABLE ( [colbit] NVARCHAR(255) );
--DECLARE @tablename VARCHAR(255) = 'tmpShell';
INSERT @tcols
SELECT
'count(' + [columns].[name] + ') as ' + [columns].[name] + ', ' AS [colbit]
FROM
[sys].[columns]
WHERE
[columns].[object_id] = OBJECT_ID(@tableName);
SELECT
@cols = COALESCE(@cols, ', ', '') + [@tcols].[colbit]
FROM
@tcols;
SELECT
@cols = SUBSTRING(@cols, 1, ( LEN(@cols) - 1 ));
SELECT
@cols = ISNULL(@cols, '');
SELECT
@sql = 'select patientid, count(*) as Rows' + @cols + ' from ' + @tableName + ' group by patientid having count(*) > 0';
CREATE TABLE [tmpShell2]
(
[patientid] VARCHAR(15)
,[Rows] CHAR(2)
,[Rn] CHAR(2)
,[patId] CHAR(2)
,[fname] CHAR(2)
,[lname] CHAR(2)
,[dob] CHAR(2)
,[addr1] CHAR(2)
,[city] CHAR(2)
,[state] CHAR(2)
,[zip] CHAR(2)
,[country] CHAR(2)
,[psite] CHAR(2)
,[csite] CHAR(2)
,[ssite] CHAR(2)
,[scode] CHAR(2)
,[sfid] CHAR(2)
,[taskid] CHAR(2)
,[errormsg] CHAR(2)
);
INSERT INTO [tmpShell2]
EXEC [sys].[sp_executesql]
@sql;
DECLARE @tbl VARCHAR(255) = 'tmpShell2';
SELECT DISTINCT
[TS].[patientid]
, STUFF((
SELECT DISTINCT
', ' + [C].[name]
FROM
[tmpShell2] AS [TS2]
JOIN [sys].[columns] AS [C]
ON [C].[object_id] = OBJECT_ID(@tbl)
WHERE
[C].[name] NOT IN ( 'SFID', 'TaskId', 'ErrorMsg' )
AND [C].[name] IS NOT NULL
FOR
XML PATH('')
), 1, 1, '')
FROM
[tmpShell2] AS [TS];
DROP TABLE [dbo].[tmpShell2];
END;
GO
EXEC [sp_aaShowAllNullColumns]
'tmpShell';
</pre>
Run Code Online (Sandbox Code Playgroud)
我认为你复杂的事情.
您可以尝试使用CASE EXPRESSION:
SELECT t.patientID,
CASE WHEN t.fname is NULL THEN 'Fname,' ELSE '' END +
CASE WHEN t.Lname is NULL THEN 'Lname,' ELSE '' END +
CASE WHEN t.DOB is NULL THEN 'DOB,' ELSE '' END
..... as ErrorMsg
FROM YourTable t
Run Code Online (Sandbox Code Playgroud)
这将导致最后一个不必要的逗号errorMsg,为了处理它你可以这样做:
REPLACE(CASE... +
CASE... +
CASE WHEN t.DOB is NULL THEN 'DOB,' ELSE '' END
..... + ' ') ', ','') as ErrorMsg
Run Code Online (Sandbox Code Playgroud)
这将使最后一个逗号唯一,因为它将有一个与其连接的空间,并确保只删除它.
像这样的事情怎么样?
SELECT
a.PatientID
, CASE a.tmpCol
WHEN '' THEN NULL
ELSE STUFF(a.tmpCol,1,1,'')
END AS ErrorMsg
FROM
(
SELECT
PatientID
, CASE WHEN FirstName IS NULL THEN ',FirstName' ELSE '' END
+ CASE WHEN LastName IS NULL THEN ',LastName' ELSE '' END
+ CASE WHEN DOB IS NULL THEN ',DOB' ELSE '' END AS tmpCol
FROM
<tableName>
) a;
Run Code Online (Sandbox Code Playgroud)