2017-12-20 12 views
0

Ich habe eine Tabelle mit dem Namen @ Tbl1, jede GROUP ist 1 Zeile und ich muss die Anzahl der Zeilen für jeden @ Tbl_Insert-Typ extrahieren.Einfügen in Tabelle mit String einfügen oder Tabelle Typ

Declare @Tbl1 Table (TableName NVARCHAR(250),ColumnName NVARCHAR(250),DataType NVARCHAR(250),DataValue NVARCHAR(250),InGroup NVARCHAR(250)) 
Declare @Tbl_Insert Table (ID INT, Name NVARCHAR(250), Age INT) 

-- Sample Data 
Insert Into @Tbl1 values ('@Tbl_Insert','ID','INT','1','Group1'),('@Tbl_Insert','Name','NVARCHAR(250)','John.Adam','Group1'),('@Tbl_Insert','Age','INT','10','Group1') 
Insert Into @Tbl1 values ('@Tbl_Insert','ID','INT','2','Group2'),('@Tbl_Insert','Name','NVARCHAR(250)','Andy.Law','Group2'),('@Tbl_Insert','Age','INT','18','Group2') 

kann I @ TBL1 konvertieren, indem Zeile in @Table_TEMP

Declare @Table_TEMP (Data nvarchar(max)) 

Insert Into @Table_TEMP 
SELECT LEFT([DataValues] , LEN([DataValues])-1) 
    FROM @Tbl1 AS extern 
    CROSS APPLY 
    (

     SELECT Concat('''', Replace(ISNULL([DataValue],''), '''','') + ''',') 
     FROM @Tbl1 AS intern 
     WHERE extern.InGroup = intern.InGroup 
     Order By InGroup, ColumnName 
     FOR XML PATH('') 
    ) pre_trimmed ([DataValues]) 
    GROUP BY InGroup, [DataValues]  

Ich habe zu extrahieren, die Anzahl der Zeilen in @ Tbl1 (Or @Table_TEMP) zu @Tbl_Insert zu bringen.

Ich möchte den Cursor nicht als Schleife verwenden Zeile für Zeile in @Table_TEMP einfügen, weil, wenn Sie mit großen Daten (Beispiel> 10000 Zeilen) getroffen haben. Es ist zu langsam.

Bitte helfen.

+0

Bitte lesen Sie [diese] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) für ein paar Tipps auf die Verbesserung Ihrer Frage. – HABO

+0

Vielen Dank für Ihre Hilfe, ich habe nur die Frage für klar zu bearbeiten. –

Antwort

0

fand ich Probe in stackorverflow

Declare @tbl_Temp Table (Data NVARCHAR(MAX)) 
Declare @tbl2 Table (A NVARCHAR(MAX),B NVARCHAR(MAX),C NVARCHAR(MAX)) 
Insert Into @tbl_Temp values ('a1*b1*c1') 
INSERT INTO @tbl2 (A,B,C) 
SELECT PARSENAME(REPLACE(Data,'*','.'),3) 
     ,PARSENAME(REPLACE(Data,'*','.'),2) 
    ,PARSENAME(REPLACE(Data,'*','.'),1) 
FROM @tbl_Temp 

select * from @tbl2 

Es ist fast gleich, aber,

  1. Meine Daten "DOT" haben, ParseName

  2. nicht verwenden kann ich Zahlen wissen müssen von DOT zum Erstellen von Dynamics SQL?

  3. PARSENAME unterstützt nur 3 "DOT", es ist null, wenn mehr Punkt. BEISPIEL:

Deklarieren @ObjectName nVarChar (1000) Set @ObjectName = 'HeadOfficeSQL1.Northwind.dbo.Authors'

ParseName (@ObjectName, 5) als Server4 SELECT, ParseName (@ObjectName, 4) als Server, ParseName (@ObjectName, 3) als DB, ParseName (@ObjectName, 2) als Inhaber, ParseName (@ObjectName, 1) als Objekt

0

Wenn i richtig verstanden müssen Sie apply verwenden, um die Datensätze zu holen & die Daten in andere Tabelle zu tun, wie ParseName

insert into @Tbl_Insert (ID, Name, Age) 
select max(a.id) [id], max(a.Name) [Name], max(a.Age) [Age] from @Tbl1 t 
cross apply 
      (values 
      (case when t.ColumnName = 'ID' then t.DataValue end, 
       case when t.ColumnName = 'Name' then t.DataValue end, 
       case when t.ColumnName = 'Age' then t.DataValue end, t.InGroup) 
     ) as a(id, Name, Age, [Group]) 
group by a.[Group] 

select * from @Tbl_Insert 
0

ich beide @Tbl_Insert & erstellen 1 Speicher ein. Es hat eine verbesserte Leistung.

create function dbo.fnGetCsvPart(@csv varchar(8000),@index tinyint, @last bit = 0) 
returns varchar(4000) 
as 
/* function to retrieve 0 based "column" from csv string */ 
begin 
    declare @i int; set @i = 0 
    while 1 = 1 
    begin 
     if @index = 0 
     begin 
      if @last = 1 or charindex(',',@csv,@i+1) = 0 
       return substring(@csv,@i+1,len(@csv)[email protected]+1) 
      else 
       return substring(@csv,@i+1,charindex(',',@csv,@i+1)[email protected]) 
     end 
     select @index = @index-1, @i = charindex(',',@csv,@i+1) 
     if @i = 0 break 
    end 
    return null 
end 
GO