插入带有字符串插入或表类型的表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入带有字符串插入或表类型的表相关的知识,希望对你有一定的参考价值。

我有一个名为@ Tbl1的表,每个GROUP都是1行,我必须将每个行的行数提取到@Tbl_Insert类型。

 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')

我可以将@ tbl1逐行转换为@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]     

我必须将@ Tbl1(或@Table_TEMP)中的行数提取到@Tbl_Insert。

我不想使用游标在@Table_TEMP中逐行循环插入,因为当你遇到大数据时(例如> 10000行)。它运行缓慢。

请帮忙。

答案

我在stackoverflow中找到了样本

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

它几乎相同,但是,

  1. 我的数据有“DOT”,不能使用PARSENAME
  2. 我必须知道DOT的数量才能构建动态SQL?
  3. PARSENAME仅支持3“DOT”,更多Dot时为空。例:

声明@ObjectName nVarChar(1000)设置@ObjectName ='HeadOfficeSQL1.Northwind.dbo.Authors'

SELECT PARSENAME(@ ObjectName,5)为Server4,PARSENAME(@ ObjectName,4)为Server,PARSENAME(@ ObjectName,3)为DB,PARSENAME(@ ObjectName,2)为Owner,PARSENAME(@ ObjectName,1)为Object

另一答案

如果,我理解正确你需要使用apply来获取记录并将数据插入其他表

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
另一答案

我同时做@Tbl_Insert和创建1商店就像PARSENAME一样。它提高了性能。

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)-@i+1)
            else
                return substring(@csv,@i+1,charindex(',',@csv,@i+1)-@i-1)
        end
        select @index = @index-1, @i = charindex(',',@csv,@i+1)
        if @i = 0 break
    end
    return null
end
GO

以上是关于插入带有字符串插入或表类型的表的主要内容,如果未能解决你的问题,请参考以下文章

通过包过程插入带有可变数组列的表时出错

如何在 PHP“回声”中插入带有撇号和其他特殊字符的文本? [复制]

插入带有字符串的数组时,postgresql 查询会出错

拆分分隔符分隔的字符串并插入到oracle 11中的表中

Hive:无法插入到带有地图列的表中

使用 OLEDBConnection 将新记录插入到带有 Visual Basic 的表中