我有以下功能,接受CSV&除界仪和拆分
ALTER FUNCTION [dbo].[FN_Split] (@String varchar(max), @Delimiter char(1))
returns @temptable TABLE (orderId int,items varchar(max))
as
begin
declare @idx int
declare @i int=0
declare @slice varchar(8000)
declare @orderId int = 0 --<added a counter
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(orderId, Items) values(@orderId, @slice)
set @orderId = @orderId+1 --<increment the counter
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
&安培;像这样的存储过程使用上述功能&amp;将结果插入数据库:
ALTER PROCEDURE dbo.StoredProcedure3
(
--@tableName nvarchar(max),
@p_SourceText nvarchar(max),
@p_Delimeter nvarchar(100)=','
)
AS
BEGIN
DECLARE @sql nvarchar(max)
--select * from fn_ParseText2Table(@p_SourceText, @p_Delimeter)
--insert into Person values (@sql)
declare @i int=0
DECLARE @max int=3
while @i<=@max
begin
if @i=0
begin
set @sql='insert into Person values( select items from'+dbo.FN_Split(@p_SourceText,
@p_Delimeter)+ 'as where orderId ='+0+')'
end
else
begin
if @i=(@max-1)
begin
set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,
@p_Delimeter)+' where orderId ='+@i+')'
end
else
begin
set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,
@p_Delimeter)+ 'where orderId ='+@i+') UNION'
end
end
set @i=@i+1
end
END
但执行程序后我得到以下错误: 找不到列“dbo”或用户定义的函数或聚合“dbo.FN_Split”,或者名称不明确。 没有行影响。 (0行返回)
请帮助摆脱它...
答案 0 :(得分:1)
首先,确保您在正确的数据库中运行了创建脚本。
其次,正如@astander开始提到的那样,你正在错误地使用函数结果。
您的函数返回一个表,而不是一个值。您需要在sql语句中执行该函数,而不是在构建即席查询期间执行。例如,此代码:
set @sql=@sql+'UNION select items from'+ dbo.FN_Split(@p_SourceText,
@p_Delimeter)+' where orderId ='+@i+')'
会变成:
set @sql = @sql+'UNION select items from dbo.FN_Split(' + @p_SourceText +', ' +
@p_Delimeter + ') where orderId =' + @i + ')'
在您当前引用该功能的任何地方进行类似的更改。
答案 1 :(得分:0)
我想澄清旁观者的评论
尝试这样的代码:
while @i<=@max
begin
if @i=0
begin
set @sql='insert into Person select items from dbo.FN_Split(@p_SourceText,
@p_Delimeter) where orderId = 00'
end
else
begin
if @i=(@max-1)
begin
set @sql=@sql+'UNION select items from dbo.FN_Split(@p_SourceText,
@p_Delimeter) where orderId ='+@i
end
else
begin
set @sql=@sql+'UNION select items from dbo.FN_Split(@p_SourceText,
@p_Delimeter) where orderId ='+@i UNION'
end
end
set @i=@i+1
end
END
答案 2 :(得分:0)
对于我的情况,当我将数据从一个数据库导出到另一个数据库时,它确实是一个缺少的函数。无法在目标数据库中找到&gt;功能&gt;标量值函数。然后我创建了[dbo]。[equals]并且它有效。 (从源数据库复制)