2010-08-10 76 views

回答

0

我endup使用foreach <insert>

1

Arrays and Lists in SQL Server 2008看看得到一些想法

SQL Server 2008还支持这种多行值语法在SQL Server之前,表的可用性解决这个2005年(

create table #bla (id int, somename varchar(50)) 

insert #bla values(1,'test1'),(2,'Test2') 

select * from #bla 
+0

如果你加一点适用的内容你的答案,从该链接的页面,如果可能的话很高兴。除非你知道这个页面永远不会消失。 – thursdaysgeek 2010-08-10 20:23:19

+0

我看着它之前我发布在这里,我使用LINQ到SQL,我想做的一切在SQL服务器端。 – 2010-08-10 20:25:27

2

的一种方式有价值的参数)是通过一个分隔列表并使用Split功能。如果你使用的是两列的阵列,您可能需要使用两个不同的分隔符:

Declare @Values varchar(max) 
Set @Values = '1,abc|2,bbc|3,cnn' 

With SplitItems As 
    (
    Select S.Value As [Key] 
     , S2.Value 
     , Row_Number() Over (Partition By S.Position Order By S2.Position) As ElementNum 
    From dbo.Split(@Values,'|') As S 
     Outer Apply dbo.Split(S.Value, ',') As S2 
    ) 
Select [Key] 
    , Min(Case When S.ElementNum = 1 Then S.Value End) As ListKey 
    , Min(Case When S.ElementNum = 2 Then S.Value End) As ListValue 
From SplitItems As S 
Group By [Key] 

Create Function [dbo].[Split] 
( 
    @DelimitedList nvarchar(max) 
    , @Delimiter nvarchar(2) = ',' 
) 
RETURNS TABLE 
AS 
RETURN 
    (
    With CorrectedList As 
     (
     Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      + @DelimitedList 
      + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      As List 
      , Len(@Delimiter) As DelimiterLen 
     ) 
     , Numbers As 
     (
     Select Row_Number() Over (Order By c1.object_id) As Value 
     From sys.columns As c1 
      Cross Join sys.columns As c2 
     ) 
    Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position 
     , Substring (
        CL.List 
        , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen  
        , CharIndex(@Delimiter, CL.list, N.Value + 1)       
         - (CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen) 
        ) As Value 
    From CorrectedList As CL 
     Cross Join Numbers As N 
    Where N.Value < Len(CL.List) 
     And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter 
    ) 

另一种方式来处理这个不表值参数是通过XML作为一个nvarchar(最大):

Declare @Values nvarchar(max) 
Set @Values = '<root><Item Key="1" Value="abc"/> 
<Item Key="2" Value="bbc"/> 
<Item Key="3" Value="cnn"/></root>' 

Declare @docHandle int 
exec sp_xml_preparedocument @docHandle output, @Values 

Select * 
From OpenXml(@docHandle, N'/root/Item', 1) 
    With([Key] int, Value varchar(10)) 
+0

太多的代码:.... – 2010-08-11 17:23:53

+0

@Nisar汗 - 这听起来很像“太多笔记”。如果你使用XML,你只需要三行代码(我把这个查询当作一行代码)。在第一种解决方案中,一旦创建了拆分功能(一次只发生一次操作),您又会下降到三行代码。 – Thomas 2010-08-11 18:37:00