Function 如何将Tsql标量函数转换为表函数?
我正在使用SSMS 2008,我有以下标量函数来获取文本字符串并从Microsoft Word中删除所有元标记。标签包含在中,一列中可以有任意数量的标签/记录 我创建了这个标量函数来更新该列中的每一行Function 如何将Tsql标量函数转换为表函数?,function,sql-server-2008,tsql,scalar,Function,Sql Server 2008,Tsql,Scalar,我正在使用SSMS 2008,我有以下标量函数来获取文本字符串并从Microsoft Word中删除所有元标记。标签包含在中,一列中可以有任意数量的标签/记录 我创建了这个标量函数来更新该列中的每一行 create function dbo.ufn_StripHTML ( @Input varchar(max), @Delimiter char(1) ) returns varchar(max) as begin declare @Ou
create function dbo.ufn_StripHTML
( @Input varchar(max),
@Delimiter char(1)
)
returns varchar(max)
as
begin
declare @Output varchar(max)
select @Input = replace(replace(@input, '<', @Delimiter), '>', @Delimiter)
select @Output = isnull(@Output, '') + s
from ( select row_number() over (order by n.id asc) [i],
substring(@Delimiter + @Input + @Delimiter, n.id + 1, charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.id + 1) - n.id - 1) [s]
from [evolv_cs].[dbo].[progress_note] n
where n.id = charindex(@Delimiter, @Delimiter + @Input + @Delimiter, n.id) and
n.id <= len(@Delimiter + @Input)
) d
where i % 2 = 1
return @Output
end
但是ALTERVIEW不支持添加列。还有别的办法吗?这是我试图修改的原始临时表:
select [progress_note].[note_text], [progress_note].[event_log_id]
INTO #TEMP_PN
from [evolv_cs].[dbo].[progress_note]
group by [progress_note].[event_log_id], [progress_note].[note_text]
[注\文本]为varcharmax,事件\日志\ id为uniqueidentifier。所以[note_text]包含一堆字符。如何修改此函数以使其成为表函数
当然,如果我在这个函数中尝试用TEMP_PN替换[progress_note]表,它会出错,因为它无法识别它。那么,如何为我的案例修改此函数
同时,我开发了一个表函数,它接受并输出一个表参数。它不会出错,但也不会返回我希望得到的解析数据。少了什么
CREATE TYPE dbo.MyTableType AS TABLE
(
col1 int identity(1,1) NOT NULL,
col2 varchar(max) NULL
)
GO
CREATE TABLE [dbo].[MyTable] (
[col1] [int] identity(1,1) NOT NULL,
[col2] [varchar](max) NULL
)
GO
create PROC usp_AddRowsToMyTable @MyTableParam MyTableType READONLY, @Delimiter varchar(30)
as
INSERT INTO MyTable([col2])
SELECT [col2]
FROM @MyTableParam
--update MyTable
--set col2 = replace(replace(MyTable.col2, '<', @Delimiter), '>', @Delimiter)
select s, i, t
from(
select MyTableInput.col1 [i],
replace(replace(MyTable.col2, '<', @Delimiter), '>', @Delimiter) as t,
substring(@Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1 + 1,
charindex(@Delimiter, @Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1 + 1) - MyTable.col1 - 1) [s]
from MyTable
inner join MyTable as MyTableInput on MyTable.col1 = MyTableInput.col1
where MyTable.col1 = CHARINDEX(@Delimiter, @Delimiter + MyTableInput.col2 + @Delimiter, MyTable.col1)
and MyTable.col1 <= LEN(@Delimiter + MyTableInput.col2)
) d
DECLARE @MyTable MyTableType
INSERT INTO @MyTable(col2)
VALUES ('<h><dsf>2000<h><dsf>'),
('<sd><dsf>2001'),
('2002<vnv><dsf>'),
('<gsd><dsf>2003<h><dsf>'),
('<eefs><dsf><h><dsf>2004<dfgd><dsf>')
EXEC dbo.usp_AddRowsToMyTable @MyTableParam = @MyTable, @Delimiter = '|'
我不确定我是否理解您的问题,但以下是如何修改函数,使其返回一个称为表值函数的表:
create function dbo.ufn_StripHTML
( @Input varchar(max),
@Delimiter char(1)
)
returns @retYourNewTable table
(
id int primary key clustered not null,
yoursecond column varchar(100) null,
....
)
as
....
这就是您要找的吗?我不确定是否理解您的问题,但下面是如何修改函数以使其返回一个称为表值函数的表:
create function dbo.ufn_StripHTML
( @Input varchar(max),
@Delimiter char(1)
)
returns @retYourNewTable table
(
id int primary key clustered not null,
yoursecond column varchar(100) null,
....
)
as
....
这就是您要寻找的吗?OP正在寻找解决该问题的功能解决方案,而不是语法解决方案。别以为这就是他要找的,卡什是对的。我正在寻找一个功能解决方案。请参阅更新的说明。OP正在寻找解决该问题的功能解决方案,而不是语法解决方案。别以为这就是他要找的,卡什是对的。我正在寻找一个功能解决方案。请参阅更新的说明。此不存在的id列的含义是什么?在标量函数中,将其与CHARINDEX的结果以及LEN的结果进行比较。此列表示哪种类型的值?我的意思是,它不是“身份”意义上的ID,是吗?这个不存在的ID列应该是什么意思?在标量函数中,将其与CHARINDEX的结果以及LEN的结果进行比较。此列表示哪种类型的值?我的意思是,它不是“身份”意义上的身份证,是吗?