我遇到了一个非常类似的问题,并且已经成功解决了,尽管我正在使用SQL Server 2000。我知道这是一个旧问题,但认为在此发布解决方案仍然有效,因为可能还有其他像我一样使用旧版本并需要帮助的人。
这里的诀窍是:SQL Server不接受将表传递给UDF,也不能传递T-SQL查询,以便函数创建临时表或甚至调用存储过程来执行此操作。所以,相反,我创建了一个保留表,我称之为xtList。这将保存要处理的值列表(1列,按需)。
CREATE TABLE [dbo].[xtList](
[List] [varchar](1000) NULL
) ON [PRIMARY]
接下来是用于填充列表的存储过程。虽然这不是必需的,但我认为它非常有用且符合最佳实践。
CREATE PROCEDURE [dbo].[xpCreateList]
@ListQuery varchar(2000)
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM xtList
INSERT INTO xtList
EXEC(@ListQuery)
END
现在,您可以使用xtList以任何方式处理列表。您可以在过程中使用它(用于执行多个T-SQL命令),标量函数(用于检索多个字符串)或多语句表值函数(检索字符串,但像在表格中一样,每行1个字符串)。为了完成任何这些操作,您都需要使用游标:
DECLARE @Item varchar(100)
DECLARE cList CURSOR DYNAMIC
FOR (SELECT * FROM xtList WHERE List is not NULL)
OPEN cList
FETCH FIRST FROM cList INTO @Item
WHILE @@FETCH_STATUS = 0 BEGIN
<< desired action with values >>
FETCH NEXT FROM cList INTO @Item
END
CLOSE cList
DEALLOCATE cList
希望您能执行以下操作,具体取决于所创建的对象类型:
存储过程:
CREATE PROCEDURE [dbo].[xpProcreateExec]
(
@Cmd varchar(8000),
@ReplaceWith varchar(1000)
)
AS
BEGIN
DECLARE @Query varchar(8000)
<< cursor start >>
SET @Query = REPLACE(@Cmd,@ReplaceWith,@Item)
EXEC(@Query)
<< cursor end >>
END
标量函数
CREATE FUNCTION [dbo].[xfProcreateStr]
(
@OriginalText varchar(8000),
@ReplaceWith varchar(1000)
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @Result varchar(8000)
SET @Result = ''
<< cursor start >>
SET @Result = @Result + REPLACE(@OriginalText,@ReplaceWith,@Item) + char(13) + char(10)
<< cursor end >>
RETURN @Result
END
多语句表值函数
CREATE FUNCTION [dbo].[xfProcreateInRows]
(
@OriginalText varchar(8000),
@ReplaceWith varchar(1000)
)
RETURNS
@Texts TABLE
(
Text varchar(2000)
)
AS
BEGIN
<< cursor start >>
INSERT INTO @Texts VALUES(REPLACE(@OriginalText,@ReplaceWith,@Item))
<< cursor end >>
END