Sql 表值函数,选择多行

Sql 表值函数,选择多行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表值函数,它通过一个公共分隔符将字符串拆分,并将其输出到具有以下结构的表中: @ValueLookup TABLE ( Value nvarchar(100), ValueIndex int ) 我主要使用它来分割组合ID值,例如1234-5678: dbo.SplitString('1234-5678', '-') 目前,我正在使用两个SELECT,在拆分两个值后获取它们,并将它们转换为整数: DECLARE @FirstID INT DECLARE @Secon

我有一个表值函数,它通过一个公共分隔符将字符串拆分,并将其输出到具有以下结构的表中:

@ValueLookup TABLE 
(
    Value nvarchar(100),
    ValueIndex int
)
我主要使用它来分割组合ID值,例如
1234-5678

dbo.SplitString('1234-5678', '-')
目前,我正在使用两个
SELECT
,在拆分两个值后获取它们,并将它们转换为整数:

DECLARE @FirstID INT
DECLARE @SecondID INT
SELECT 
    @FirstID = CONVERT(INT, Value)
FROM dbo.SplitString('1234-5678', '-')
WHERE ValueIndex = 1
SELECT 
    @SecondID = CONVERT(INT, Value)
FROM dbo.SplitString('1234-5678', '-')
WHERE ValueIndex = 2
是否有一种方法可以获取这两个值并在一个
SELECT
语句中分配它们

declare @FirstId int, @SecondId int;
select 
    @FirstID  = convert(int,min(case when ValueIndex = 1 then Value end))
  , @SecondID = convert(int,min(case when ValueIndex = 2 then Value end))
from dbo.SplitString('1234-5678', '-')

select 
    FirstId  = @FirstId
  , SecondId = @SecondId
rextester演示:

返回:

+---------+----------+
| FirstId | SecondId |
+---------+----------+
|    1234 |     5678 |
+---------+----------+
演示使用Jeff Moden的CSV拆分器表值函数完成,函数名和输出列重命名


拆分字符串引用:

还有另一种选择

示例

Declare @String varchar(max) = '1234-5678'
Declare @FirstID INT
Declare @SecondID INT

Select @FirstID  = xDim.value('/x[1]','int')
      ,@SecondID = xDim.value('/x[2]','int')
From  (Select Cast('<x>' + replace(@String,'-','</x><x>')+'</x>' as xml) as xDim) as A 
Declare@String varchar(max)='1234-5678'
声明@FirstID INT
声明@SecondID INT
选择@FirstID=xDim.value('/x[1]',int')
,@SecondID=xDim.value('/x[2]','int')
从(选择Cast(“”+replace(@String,'-',“”)+''作为xml)作为xDim)作为

非常好,正是我想要的。我不知道您可以在
CASE
语句中引用另一行值。因为我还有几分钟的时间可以接受,所以我对
MIN
的用法很好奇?这只是转换的良好实践吗?@X3074861X选择
min()
是任意的。您也可以使用
max()
。如果在聚合函数内部而不是外部转换为
int
,也可以使用
sum()