插入带有字符串插入或表类型的表
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
它几乎相同,但是,
- 我的数据有“DOT”,不能使用PARSENAME
- 我必须知道DOT的数量才能构建动态SQL?
- 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
以上是关于插入带有字符串插入或表类型的表的主要内容,如果未能解决你的问题,请参考以下文章