Fragensteller
Problem bei Zuweisung von Werten in T-SQL Skript

Frage
-
I try to get a statistical overview how much columns of a table (person) are empty, have no values or are filled.
But the only count I get are the filled ones:
T_Spalte T_LEER T_NVL T_GEFUELLT
Vorname 0 0 1000If I start the select part directly I get the correct number, but I want to have a more generic kind of script:
here is the script:
DECLARE @Result TABLE
(
T_Col varchar(100),
T_LEER bigint,
T_NVL bigint,
T_GEFUELLT bigint
);
DECLARE @C CURSOR,
@Col varchar(100),
@Leer bigint,
@NVL bigint,
@Gefuellt bigint
SET @C = CURSOR FAST_FORWARD FOR
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Person' ;
OPEN @C;
FETCH NEXT FROM @C INTO @Col;
WHILE @@fetch_status = 0
BEGIN
set @NVL = (select count(1) from Person where @Col is null)/* I use convert to check len, in the person-table I have text-type columns and so I can not use len directly */
set @Leer = (select count(1) from Person where (len(convert(varchar(10), @Col) )=0) )
set @Gefuellt = (select count(1) from Person where @Col is not null and len(convert(varchar(10), @Col)) >0 )
INSERT INTO @Result VALUES(@Col, @Leer, @NVL, @Gefuellt)
FETCH NEXT FROM @C INTO @Col;
END
SELECT * FROM @Result;I have tryed a lot of different changes but I have no idea what is the problem, maybe some expert of you have an idea.
Many thanks, and sorry for my bad englich but I tryed my best... ;-)
Alle Antworten
-
set @NVL = (select count(1) from Person where @Col is null)
Hallo Kalle,
Deutsche Subject, Englischer Text; konntest Du Dich nicht entscheiden? Da wir in einem de-DE Forum sind, bleiben wir doch einfach bei Deutsch.
Ich vermute mal, das Du in der Annahme das hier auf das Feld, dessen Name in der Variable "@Col" steht, gefilter wird? Nein, tut es nicht, es wird nur der Wert der Variable validiert und nicht irgendwelche Felder.
Du müsstest hier dynamisches SQL verwenden in der Art:
DECLARE @sql nvarchar(4000); set @sql = N'select count(1) from Person where [' + @Col + N'] is null)'; EXEC sp_executeSQL @sql;
Olaf Helper
[ Blog] [ Xing] [ MVP] -
Hallo,
ups, da habe ich nicht gesehen ich hatte auf einen Link bei MS geklickt und war dann gleich bei der Eingabe.
Aber ich habe das Problem jetzt gelöst, vielen Dank für die Hilfe, jetzt auch in einem CodeBlock...:
DECLARE @Result TABLE ( T_Spalte varchar(100), T_LEER bigint, T_NVL bigint, T_GEFUELLT bigint ); DECLARE @C CURSOR, @Col varchar(100), @Leer bigint, @NVL bigint, @Gefuellt bigint, @sql nVarchar(400) SET @C = CURSOR FAST_FORWARD FOR SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Person'; OPEN @C; FETCH NEXT FROM @C INTO @Col; WHILE @@fetch_status = 0 BEGIN /* convert ... weil es Spalten im TEXT Format gibt, die nicht mit len() bearbeietet werden können */ set @sql = N'select @GEFUELLT = count(1) from Person where len(convert(varchar(10),[' + @Col + N']))>0 and [' + @Col + N'] is not null'; EXEC sp_executeSQL @SQL, N'@GEFUELLT bigint out', @GEFUELLT out; set @sql = N'select @LEER = count(1) from Person where len(convert(varchar(10),[' + @Col + N']))=0 and [' + @Col + N'] is not null'; EXEC sp_executeSQL @SQL, N'@LEER bigint out', @LEER out; set @sql = N'select @NVL = count(1) from Person where [' + @Col + N'] is null'; EXEC sp_executeSQL @SQL, N'@NVL bigint out', @NVL out; INSERT INTO @Result VALUES(@Col, @LEER,@NVL,@GEFUELLT) FETCH NEXT FROM @C INTO @Col; END SELECT * FROM @Result;
Und dann läuft es auch, erstmal vielen Dank...
-
/* convert ... weil es Spalten im TEXT Format gibt, die nicht mit len() bearbeietet werden können */
Für den Fall kannst Du die DATALENGTH (Transact-SQL) Funktion verwenden, die akzeptiert auch die Typen wie Text, Image, Varchar(max) etc.Olaf Helper
[ Blog] [ Xing] [ MVP]