SQL-запрос с функцией, которая возвращает 2 значения - PullRequest
2 голосов
/ 18 января 2012

Как бы я мог вернуть несколько значений (скажем, число и строку) из пользовательской функции в SQL Server внутри запроса?

например, select col1, dbo.function1(col2) from table

и результатбыть

Col1 |        Col2       |         Col3
-----+-------------------+---------------------
x    | Num from function | String from function

Я не хочу вызывать функцию 2 раза, потому что я использую какой-то сложный код и не хочу выполнять его дважды.Просто чтобы взять последние 2 результата в Return

Ответы [ 3 ]

9 голосов
/ 18 января 2012

Извлечение из - http://www.sqlteam.com/article/returning-complex-data-from-user-defined-functions-with-cross-apply

Возвращение нескольких значений из UDF может быть достаточно легко выполнено в SQL Server, но мы должны вернуть эти значения в виде виртуальной таблицы

--Sample Table
CREATE TABLE emails 
(
    ID INT PRIMARY KEY, 
    EmailAddress VARCHAR(100)
)
GO

--Dummy Data
INSERT INTO emails
SELECT 1,'jeff@jeff.com' UNION ALL
SELECT 2,'yak@sqlteam.com' UNION ALL
SELECT 3,'billg@microsoft.com'

--UDF Creation
CREATE FUNCTION EmailParse (@email VARCHAR(1000))
RETURNS @t TABLE (UserName VARCHAR(20), Domain VARCHAR(20))
AS
BEGIN
    DECLARE @i INT

    SELECT @i = charindex('@', @email,1);

    IF (@i > 1)
        INSERT INTO @t VALUES (LEFT(@email,@i-1), SUBSTRING(@email,@i+1,20))
    ELSE
        INSERT INTO @t VALUES (NULL,NULL)

    RETURN 
END


--UDF Usage
SELECT 
    emails.ID, s.Username, s.Domain
FROM 
    emails
CROSS APPLY 
EmailParse(emails.EmailAddress) s
5 голосов
/ 18 января 2012

Я бы, наверное, создал таблицу UDF. Что-то вроде этого:

CREATE FUNCTION [owner].[function_name]
(
      @parm1 <datatpe> = <default>
)
RETURNS TABLE
AS
      RETURN
      (
      SELECT <column1, column2, ...>
      FROM <table, view, etc.>
      WHERE <some condition applies>      -- optional clauses
)

подробнее здесь .

Может показаться, что это пустая трата, если вы возвращаете только одну строку, но я думаю, что ваши альтернативы (xml, анализ значений из строки на лету) усложнят ситуацию.

0 голосов
/ 18 января 2012

Вы не можете создать функцию, которая возвращает два значения.В чем проблема, когда вы вызываете функцию дважды?

Я нашел статью в TechNet, в которой объясняется, как создать Табличные значения пользовательских функций .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...