我在List<T>
中有一个名称/值对,并且需要找到将这些传递给存储过程的最佳方法。将名称/值对列表传递到存储过程
Id Name
1 abc
2 bbc
3 cnn
....
...
完成此操作的最佳方法是什么?
我在List<T>
中有一个名称/值对,并且需要找到将这些传递给存储过程的最佳方法。将名称/值对列表传递到存储过程
Id Name
1 abc
2 bbc
3 cnn
....
...
完成此操作的最佳方法是什么?
我endup使用foreach <insert>
在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
的一种方式有价值的参数)是通过一个分隔列表并使用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))
太多的代码:.... – 2010-08-11 17:23:53
@Nisar汗 - 这听起来很像“太多笔记”。如果你使用XML,你只需要三行代码(我把这个查询当作一行代码)。在第一种解决方案中,一旦创建了拆分功能(一次只发生一次操作),您又会下降到三行代码。 – Thomas 2010-08-11 18:37:00
如果你加一点适用的内容你的答案,从该链接的页面,如果可能的话很高兴。除非你知道这个页面永远不会消失。 – thursdaysgeek 2010-08-10 20:23:19
我看着它之前我发布在这里,我使用LINQ到SQL,我想做的一切在SQL服务器端。 – 2010-08-10 20:25:27