Хорошо, 4 часа кодирования и всего 6 часов поиска ... и мне не лучше, чем когда я начал. Вот моя проблема. У меня есть таблица (tmpShell), и она имеет 12 столбцов. Это базовая таблица без ограничений - используется для временной отчетности. Когда мы вставляем данные, я должен извлечь идентификационный номер (PatientId) и все столбцы NAMES, где значение для этого PatientId равно null.Выбор имен столбцов, где значения 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 будет нулевым.
Я пробовал и проваливал около 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>
Вам нужно сделать это по неизвестному количеству столов или только одному? –
Какова вероятность того, что столбцы (кроме ключа) в этой таблице изменятся или что будут столбцы, в которых вам все равно, есть ли нуль? –
Да, количество таблиц неизвестно, а столбцы будут отличаться от таблицы к таблице. Вероятность того, что все изменится, очень тонкая. – RazorSharp