Ok, 4 Stunden Codierung und nur 6 Stunden Suche ... und ich bin nicht besser dran als zu Beginn. Hier ist mein Problem. Ich habe eine Tabelle (tmpShell) und es hat 12 Spalten. Es handelt sich um eine Basistabelle ohne Einschränkungen, die für temporäre Berichte verwendet wird. Wenn wir Daten einfügen, muss ich eine ID-Nummer (PatientId) und alle Spalten NAMES extrahieren, wo der Wert für diese PatientId Null ist.Auswählen von Spaltennamen, deren Werte NULL sind
Beispiel:
PatientId Fname Lname DOB 123455 Sam NULL NULL
2345455 NULL Doe 1/1/1980
09172349 John Jone NULL
Was ich zurückkehren will, ist:
PatientId ErrorMsg 123455 Lname,DOB
2345455 Fname
09172349 DOB
Natürlich, wenn alle Spalten einen Wert haben, würde die errormsg null sein.
Ich habe über 300 verschiedene Teile des Codes versucht und sind gescheitert, aber in der Nähe zu sein scheinen ich bekommen kann. Leider gibt dies nur jede Spalte zurück, nicht die Nullen.
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>
Müssen Sie dies auf eine unbekannte Anzahl von Tabellen oder nur diese tun? –
Wie groß ist die Wahrscheinlichkeit, dass sich die Spalten (mit Ausnahme des Schlüssels) in dieser Tabelle ändern oder dass es Spalten gibt, in denen es Ihnen egal ist, ob es eine Null gibt? –
Ja, die Anzahl der Tabellen ist unbekannt und die Spalten variieren von Tabelle zu Tabelle. Die Wahrscheinlichkeit, dass sich irgendetwas ändert, ist sehr gering – RazorSharp