Ne trouve pas la colonne “dbo” ou la fonction définie par l'utilisateur ou un agrégat de “dbo.FN_Split”, ou le nom est ambigu
J'ai suivantes de la fonction qui accepte le format CSV & le délimiteur de & divise
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
& la procédure stockée comme ce qui utilise la fonction ci-dessus & insère le résultat dans la base de données:
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
Mais Après l'Exécution de la Procédure j'obtiens L'erreur Suivante:
Ne trouve pas la colonne "dbo" ou la fonction définie par l'utilisateur ou un agrégat de "dbo.FN_Split", ou le nom est ambigu.
Pas de lignes affectées.
(0 ligne(s) retourné)
S'il vous plaît aider à s'en sortir...
- Sélectionnez le résultat de
dbo.FN_Split(@p_SourceText, @p_Delimeter)
dans une variable de texte et l'utiliser pour votre@sql
chaîne de la construction. - La fonction de dbo.FN_Split(@p_SourceText, @p_Delimeter) retourne un TABLEAU, pas une seule variable, ainsi que l'utilisation serait SELECT * from dbo.FN_Split(@p_SourceText, @p_Delimeter) et non SELECT dbo.FN_Split(@p_SourceText, @p_Delimeter)
- Le bug en question le titre est une simple faute de frappe, mais depuis
FN_Slit
n'apparaissent pas n'importe où ailleurs dans la question, je vais partir du principe que c'est une erreur de transcription, et non le problème. - oh non, je n'type d'erreur nom de la fonction est "FN_split" au lieu de "FN_slit"
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, assurez-vous que vous le créer un script dans la base de données correcte.
Seconde, comme @astander commencé à mentionner, vous êtes en utilisant les résultats de la fonction incorrecte.
Votre fonction retourne un tableau, pas une valeur. Vous aurez besoin pour exécuter la fonction dans le cadre de vos instructions sql, pas pendant le processus de construction de requêtes ad hoc. Par exemple, ce code:
devient:
Apporter des modifications similaires partout où vous êtes actuellement référence à la fonction.
select
au lieu devalues
lors de l'insertion, puisque vous êtes potentiellement insertion de plus d'une valeur:Insert into person select items from dbo.FN_Split('111|Mitchell|Johnson,|')
où orderId = 0` Remarque vous pouvez aussi avoir besoin des guillemets autour de votre csv élément.Je pense que pour clarifier le commentaire de astander
essayer votre code comme ceci :
Pour mon cas, c'était vraiment une fonction manquante lors de l'exportation des données à partir d'une base de données à l'autre. Ne peut être trouvé dans la base de données de destination > Fonctions > Fonctions Scalaires. Puis j'ai créé [dbo].[égal] et cela a fonctionné. (copié à partir de la source de la base de données)