web-dev-qa-db-fra.com

Appel de fonctions à valeur scalaire dans SQL

J'ai migré une base de données depuis Oracle et j'ai maintenant quelques fonctions à valeur scalaire.

Cependant, lorsque je les appelle, j'obtiens une erreur disant:

Impossible de trouver la colonne "dbo" ou la fonction définie par l'utilisateur ou l'agrégat "dbo.chk_mgr", ou le nom est ambigu.

Je l'appelle comme ça:

SELECT dbo.chk_mgr('asdf')

Qu'est-ce que je fais mal?

22
Madam Zu Zu

Êtes-vous sûr que ce n'est pas un Table-Valued Function?

La raison pour laquelle je demande:

CREATE FUNCTION dbo.chk_mgr(@mgr VARCHAR(50)) 
RETURNS @mgr_table TABLE (mgr_name VARCHAR(50))
AS
BEGIN 
  INSERT @mgr_table (mgr_name) VALUES ('pointy haired boss') 
  RETURN
END 
GO

SELECT dbo.chk_mgr('asdf')
GO

Résultat:

Msg 4121, Level 16, State 1, Line 1
Cannot find either column "dbo" or the user-defined function 
or aggregate "dbo.chk_mgr", or the name is ambiguous.

Toutefois...

SELECT * FROM dbo.chk_mgr('asdf') 

mgr_name
------------------
pointy haired boss
20
8kb

Peut faire ce qui suit

PRINT dbo.[FunctionName] ( [Parameter/Argument] )

Par exemple.:

PRINT dbo.StringSplit('77,54')
19
BJ Patel

Cette syntaxe fonctionne bien pour moi:

CREATE FUNCTION dbo.test_func
(@in varchar(20))
RETURNS INT
AS
BEGIN
    RETURN 1
END
GO

SELECT dbo.test_func('blah')

Êtes-vous sûr que la fonction existe en tant que fonction et sous le schéma dbo?

8
Tom H

Vous utilisez une fonction de valeur de table en ligne. Par conséquent, vous devez utiliser la fonction Select * From. Si vous souhaitez utiliser la fonction select (), vous devez utiliser une fonction scalaire.

https://msdn.Microsoft.com/fr-fr/library/ms186755%28v=sql.120%29.aspx

2
Julien Vavasseur