【发布时间】:2017-01-01 11:48:44
【问题描述】:
我在表格中有一个列
表 1
Tid. name fid
-----------------
1. Abc. 233
2. def. 344
3. xyz. 455
表 2
did. Status. name FID
-------------------------------------------
1 Open. Abu,def,xyz 233,344,455
现在我想将这些 fid 和 name 从 table2 中拆分为这样的存储过程:
ID status name FID
---------------
1. Open. Abc. 233
2. Open. Def. 344
3 Open. xyz. 455
更新存储过程
查询:
Create procedure as splitdata
As
Begin
Declare @fid varchar (500)
Select name, select item as fid
from spiltstring(@fid,','))
from table1
Inner join table2 on table1.fid = table2.fid
这显示错误
将 varchar 值 '233,344,455' 转换为数据类型 int 时转换失败
在 table1 中 fid 是 int 并且在 table2 fid 是 varchar 类型。
分割字符串函数是
CREATE FUNCTION SplitString
(
@Input NVARCHAR(MAX),
@Character CHAR(1)
)
RETURNS @Output TABLE (Item NVARCHAR(1000))
AS
BEGIN
DECLARE @StartIndex INT, @EndIndex INT
SET @StartIndex = 1
IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
BEGIN
SET @Input = @Input + @Character
END
WHILE CHARINDEX(@Character, @Input) > 0
BEGIN
SET @EndIndex = CHARINDEX(@Character, @Input)
INSERT INTO @Output(Item)
SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)
SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
END
RETURN
END
GO
我该怎么做?
更新
好的,根据@john 解决方案我试试这个解决方案...
但是因为我有多个其他表
喜欢
Create procedure as sp2
@tick int
As
Select
Table 4.column, Table 5.column, Table 3.column,
--so here I used solution like this
(Select b.fid
from table2 t2
cross apply
(Select fid = s2.retval
from [udf-str-parase] (t2.fid, ',') s2) b),
Table 6.column
From
Table 2
Inner join
table4 on table4.id = table5.id
..........
Where
tick = @tick
当我尝试只执行交叉应用查询时,这显示了完美的结果
但是当我尝试像这样执行整个存储过程时
Exec sp2 28
我收到此错误:
子查询返回超过 1 个值。这是不允许的。当子查询跟随 =,!=,=,>,
有什么解决办法吗?
【问题讨论】:
-
请检查。更新
标签: sql-server tsql split