带有返回2个值的函数的SQL查询

时间:2012-01-18 00:05:59

标签: sql sql-server function

如何从查询中的SQL Server中的用户定义函数返回多个值(例如,数字和字符串)?

例如select col1, dbo.function1(col2) from table

,结果为

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

我不想两次调用该函数,因为我使用了一些复杂的代码而我不想执行它两次。只需在Return

中取得最后2个结果

3 个答案:

答案 0 :(得分:9)

摘自 - http://www.sqlteam.com/article/returning-complex-data-from-user-defined-functions-with-cross-apply

  

在SQL中可以非常轻松地从UDF返回多个值   服务器,但我们必须将这些值作为虚拟表

返回
--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

答案 1 :(得分:5)

我可能会创建一个表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
)

更多信息here

如果你只返回一行,这似乎有点浪费,但我认为你的替代方案(xml,动态地解析字符串中的值)会使事情变得更加困难。

答案 2 :(得分:0)

无法创建一个返回两个值的函数。两次调用该函数时有什么问题?

我在TechNet上发现了一篇文章,解释了如何创建Table-Valued User-Defined Functions