我正在尝试从一列中获取数据字符串并将其拆分为SQL Ser 2008中的几个不同的列。例如:名称帐户445566 0010020056893010445478008 AFD 369.我正在使用借用的空格分隔功能,该功能非常好用。问题是我是T-SQL的新手并且有一些问题。
如何使函数运行完整的表而不仅仅是字符串文字?
这会生成一个temparary表,如何获取这些值并将它们插入到我的表中?它只是一个插入声明吗?
以下是脚本和用法:
CREATE FUNCTION [dbo].[Split]
(
@String varchar(max)
,@Delimiter char
)
RETURNS @Results table
(
Ordinal int
,StringValue varchar(max)
)
as
begin
set @String = isnull(@String,'')
set @Delimiter = isnull(@Delimiter,'')
declare
@TempString varchar(max) = @String
,@Ordinal int = 0
,@CharIndex int = 0
set @CharIndex = charindex(@Delimiter, @TempString)
while @CharIndex != 0 begin
set @Ordinal += 1
insert @Results values
(
@Ordinal
,substring(@TempString, 0, @CharIndex)
)
set @TempString = substring(@TempString, @CharIndex + 1, len(@TempString) - @CharIndex)
set @CharIndex = charindex(@Delimiter, @TempString)
end
if @TempString != '' begin
set @Ordinal += 1
insert @Results values
(
@Ordinal
,@TempString
)
end
return
end
--USAGE
select
s.*
from dbo.Split('Name Account 445566 0010020056893010445478008 AFD 369', ' ') as s
where rtrim(s.StringValue) != ''
GO
答案 0 :(得分:1)
要对表使用值为udf的表,您需要CROSS APPLY(或者可能是OUTER APPLY,具体取决于您希望如何处理来自udf的“无行”)。这将udf的逐行操作应用于表本身就是表
SELECT
*
FROM
mytable M
CROSS APPLY
[dbo].[Split] (M.TheColumn) S
要插入
INSERT AnotherTable (col1, col2, ...)
SELECT
col1, col2, ...
FROM
mytable M
CROSS APPLY
[dbo].[Split] (M.TheColumn) S