2016-12-23 1 views
1

Was zu tun ist, möchte ist folgendes:SQL in Spalten innerhalb Cursor Zählen

declare @Count numeric (10) 
set @Count = 0 
set @Count = (select count(*) from FILENAME where COLUMNNAME like '%e%') 
print(@tel) 

Ich möchte es auf ein paar Dateien durchgeführt werden kann, die eine Menge von Spalten und haben eine Gesamtzahl für alle Spalten , so meine Idee, eine column jeder Datei von doint so etwas wie zu bekommen war:

select * from sys.columns 
where object_id = (select object_id from sys.objects where name = 'FILENAME') 

Nun ist die einfachste Art, wie ich gedacht hätte, einen Cursor verwenden und haben die @Counts aufaddiert dort in einer anderen variablen. Aber das Problem, das ich habe, ist, dass, wenn COLUMN in einer Variablen in dem Cursor kann ich nur (soweit ich weiß), um die Abfrage wie:

declare @SQL varchar(max) 
    set @SQL = @SQL + 'set @Count = (select count(*) from FILENAME where ' 
+ @columnname + ' like ''%e%'')' 

set @tot_Count = @tot_Count + @Count 

Aber wie ich sie verstehe um dynamische SQL innerhalb einer vom Lesen Der Cursor ist ein großes Nein. Und obwohl, wenn ich die "print (sql)" sehe, scheinen die Abfragen richtig zu sein, scheint es tatsächlich nicht in einem cursos zu arbeiten.

Gibt es eine andere Möglichkeit, die gewünschten Ergebnisse zu erhalten? Oder mache ich hier etwas falsch?

Als Referenz war die Idee, die ich insgesamt hatte:

DECLARE @columnname VARCHAR(50) 
DECLARE @tot_Count NUMERIC(10), @Count NUMERIC(10) 
set @tot_Count = 0 

DECLARE MyCursor CURSOR FOR 
    SELECT name 
    from sys.columns 
     where object_id = (select object_id from sys.objects where name = 'FILENAME') 

open MyCursor 
FETCH NEXT FROM MyCursor INTO @columnname 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    declare @SQL varchar(max) 
    set @SQL ='' 
    set @Count = 0 
    set @SQL = @SQL + 'set @teller = (select count(*) from FILENAME where ' + @columnname + ' like ''%e%'')' 
    print (@SQL) 
    exec (@SQL) 

    set @tot_Count = @tot_Count + @Count 

    FETCH NEXT FROM MyCursor into @name 
END 

CLOSE MyCursor 
DEALLOCATE MyCursor 

print (@tot_teller) 
+0

Markieren Sie Ihre Frage mit der von Ihnen verwendeten Datenbank. –

+0

Cursor ist nicht gut für Tuning-Aktivität, werde ich eine Abfrage für Ihre dynamische Anforderung – LONG

Antwort

1

Variante 1: Sie dynamischen Variable Betrieb statt Cursor verwenden können.

Es ist kürzer, besser, aber Exec ist durch 4000 Zeichen begrenzt.

Variante 2: Oder Sie können Ihren Cursor und über dynamische Qry in Ihre vorbereitete Temp-Tabelle einfügen.

if object_id('tempdb..#tmptbl') is not null drop table #tmptbl 
    create table #tmptbl (cnt int not null) 

    declare @colqry varchar(800) 
    declare mycursor cursor for 
     select 'insert into #tmptbl (cnt) select count(*) cnt from ' + object_name(object_id) + ' where ' + name + ' like ''%e%''' 
     from sys.columns 
     where object_id = object_id('YourTableName') 

    open mycursor 
    fetch next from mycursor into @colqry 

    while @@fetch_status = 0 
    begin 

     print @colqry 
     exec (@colqry) 

     fetch next from mycursor into @colqry 
    end 
    close mycursor 
    deallocate mycursor 

    select sum(cnt) from #tmptbl 
+0

vielen Dank, das war, was ich tatsächlich suchte –

1
DECLARE @tot_Count int = 0 
DECLARE @Separator varchar(1) = ',' 
DECLARE @Position INT = 1 
DECLARE @ColumnNameList varchar(MAX) 
DECLARE @ColumnName varchar(1000) 
DECLARE @SQL varchar(max) = '' 

SET @ColumnNameList = STUFF((SELECT name 
    from sys.columns 
     where object_id in (select object_id from sys.objects where name = 'FILENAME') FOR XML PATH('')),1,1,'')+',' 

--print @FileNameList 

WHILE (CHARINDEX(@Separator,@ColumnNameList,@Position)!=0) 
BEGIN 
SET @ColumnName = SUBSTRING(@ColumnNameList,@Position,CHARINDEX(@Separator,@ColumnNameList,@Position)[email protected]) 
SET @SQL = @SQL + 'set @tot_Count = (select count(*) from FILENAME where ' + @ColumnName + ' like ''%e%'')' 
    -- print (@SQL) 
EXEC (@SQL) 
SET @tot_Count = @tot_Count + @tot_Count 
SET @Position = CHARINDEX(@Separator,@ColumnNameList,@Position)+1 
END 

PRINT (@tot_Count) 
+0

Mai haben einige kleinere Fehler, nicht sicher, bitte versuchen Sie, um zu sehen, ob es einen Fehler hat – LONG