AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Spalten ohne Varianzen

Ein Thema von Mokus · begonnen am 17. Apr 2014 · letzter Beitrag vom 23. Apr 2014
 
Benutzerbild von Mokus
Mokus

Registriert seit: 24. Sep 2013
165 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Spalten ohne Varianzen

  Alt 17. Apr 2014, 14:42
Datenbank: SQL • Version: XX • Zugriff über: MSSMS
Hey hoy,

hab ein kleines SQL Statement geschribene,w elches alle Spalten ohne Varianz ausgegen soll ...

Problem ?
Fucking performance......

wenn wer auf das Script schaut und verbesserung habt, bitte melden ....


SQL-Code:
/*
@Result vom dynamischen sql:
0 = NUR NULL WERTE
1 = VERSCHIEDENE WERTE
2 = EIN EINZIGER WERT DER NICHT NULL IST

*/


alter procedure GET_SPALTEN
as
begin
  set NOCOUNT on

  declare @Tab table (
    ID INT identity(0, 1) primary key,
    TAB NVARCHAR(MAX),
    SPALTE NVARCHAR(MAX),
    TYP NVARCHAR(MAX),
    WERT NVARCHAR(MAX),
    ONLYNULL BIT,
    ROW INT)

  declare @tabelle NVARCHAR(MAX)

  declare @debug INT = 0

  declare @Spalte NVARCHAR(MAX)

  declare @Typ NVARCHAR(MAX)

  declare @vorhanden SMALLINT

  declare @sql NVARCHAR(MAX)

  declare @params NVARCHAR(MAX)

  declare @einzigWert NVARCHAR(MAX)

  declare COURCHECK cursor FAST_FORWARD for
    (select
       TAB,
       SPALTE,
       TYP
     from @Tab)

  insert into @Tab
              (TAB,
               SPALTE,
               TYP)
  (select
     SYS.TABLES.NAME,
     SYS.ALL_COLUMNS.NAME,
     SYS.TYPES.NAME
   from SYS.TABLES
          join SYS.ALL_COLUMNS
            on SYS.ALL_COLUMNS.OBJECT_ID = SYS.TABLES.OBJECT_ID
          join SYS.TYPES
            on SYS.TYPES.USER_TYPE_ID = SYS.ALL_COLUMNS.USER_TYPE_ID
   where SYS.TABLES.TYPE = 'U')

  select
    NAME=SPACE(100),
    ROWS = 1000000,
    RESERVED=SPACE(255),
    DATA=SPACE(255),
    INDEX_SIZE=SPACE(255),
    UNUSED= SPACE(255)
  into #TEMP
  -- dmv
  delete #TEMP

  declare @name VARCHAR(255)

  declare CRSTOUR cursor fast_forward for
    select
      NAME
    from SYSOBJECTS
    where XTYPE = 'U--order by name

  open CRSTOUR

  fetch NEXT from CRSTOUR into @name

  while ( @@fetch_status = 0 )
  begin
    insert into #TEMP
    execute SP_SPACEUSED
      @name

    fetch NEXT from CRSTOUR into @name
  end

  close CRSTOUR

  deallocate CRSTOUR

  update @Tab
  set ROW = #TEMP.ROWS
  from @Tab as G
         join #TEMP
           on G.TAB = #TEMP.NAME

  delete @Tab
  where ROW = 0

  open COURCHECK

  fetch NEXT from COURCHECK into @tabelle, @Spalte, @Typ

  while @@fetch_status = 0
  begin
    set @sql = N' if exists( select top 1 1 from dbo.'
               + @tabelle + ' where ' + @Spalte
               + ' is not null)
begin
       if exists (select min(
' + @Spalte
               + ') from dbo.' + @tabelle + ' having min('
               + @Spalte + ') <> max(' + @Spalte + '))
       begin
       set @Result = 1   
       end
       else
       begin
       set @result = 2
       end
end
else
begin
set @result = 0
end
'

    set @params = N'@Result smallint OUTPUT @wert NVARCHAR(MAX) OUTPUT'

    exec SP_EXECUTESQL
      @sql,
      @params,
      @result = @vorhanden OUTPUT

    if @vorhanden = 1
    begin
      delete @Tab
      where TAB = @tabelle
         and SPALTE = @Spalte
    end

    if @vorhanden = 0
    begin
      set @debug = @debug + 1
    end

    /*    if @vorhanden = 0
        begin
          update @Tab
          set    ONLYNULL = 1
          where  TAB = @tabelle
            and @Spalte = SPALTE
        end
       */

    if @vorhanden = 2
    begin
      set @sql = N' select top 1 @wert = cast(' + @Spalte
                 + ' as NVARCHAR(MAX) ) from dbo.' + @tabelle

      set @params = N'@wert NVARCHAR(MAX) OUTPUT'

      exec SP_EXECUTESQL
        @sql,
        @params,
        @wert = @einzigWert OUTPUT

      update @Tab
      set WERT = @einzigWert
      where @tabelle = TAB
         and @Spalte = SPALTE
    end

    fetch NEXT from COURCHECK into @tabelle, @Spalte, @Typ
  end

  close COURCHECK

  select
    *
  from @Tab

end


dank im vorraus
Markus
es gibt nur 10 arten von menschen !
die die binär verstehen und die die nicht. !

Geändert von mkinzler (17. Apr 2014 um 14:44 Uhr) Grund: Codetag eingefügt
  Mit Zitat antworten Zitat
 

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz