Вызов скалярных функций в SQL - PullRequest
22 голосов
/ 01 сентября 2011

Я перенес базу данных из oracle, и теперь у меня есть несколько скалярных функций.

Однако, когда я звоню им, я получаю сообщение об ошибке:

Невозможно найти ни столбец "dbo", ни пользовательскую функцию, ни агрегат "dbo.chk_mgr", либо имя неоднозначно.

Я звоню так:

SELECT dbo.chk_mgr('asdf')

Что я делаю не так?

Ответы [ 5 ]

20 голосов
/ 02 сентября 2011

Вы уверены, что это не Table-Valued Function?

Причина, по которой я спрашиваю:

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

Результат:

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.

Однако ...

SELECT * FROM dbo.chk_mgr('asdf') 

mgr_name
------------------
pointy haired boss
17 голосов
/ 08 августа 2012

Можно сделать следующее

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

Например:

PRINT dbo.StringSplit('77,54')
8 голосов
/ 01 сентября 2011

Этот синтаксис прекрасно работает для меня:

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

SELECT dbo.test_func('blah')

Вы уверены, что функция существует как функция и находится под схемой dbo?

2 голосов
/ 04 августа 2015

Вы используете встроенную функцию табличного значения. Поэтому вы должны использовать функцию Select * From. Если вы хотите использовать функцию выбора (), вы должны использовать скалярную функцию.

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

0 голосов
/ 28 апреля 2016

Убедитесь, что выбрана правильная база данных. Вы можете выбрать основную базу данных, если вы пытаетесь запустить ее в новом окне запроса.

...