Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有返回2个值的函数的Sql查询_Sql_Sql Server_Function - Fatal编程技术网

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

带有返回2个值的函数的Sql查询,sql,sql-server,function,Sql,Sql Server,Function,如何在查询中从SQLServer中的用户定义函数返回多个值(例如,一个数字和一个字符串) e、 g从表中选择col1、dbo.function1col2 结果是 Col1 | Col2 | Col3 -----+-------------------+--------------------- x | Num from function | String from function 我不想调用函数两次,因为我使用了一些复杂的代码,我不想执行它两次

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

e、 g从表中选择col1、dbo.function1col2

结果是

Col1 |        Col2       |         Col3
-----+-------------------+---------------------
x    | Num from function | String from function
我不想调用函数两次,因为我使用了一些复杂的代码,我不想执行它两次。只需在返回中获取最后2个结果,就不能创建返回两个值的函数。调用函数两次有什么问题


我在TechNet上找到了一篇文章,解释了如何创建表UDF。

我可能会创建一个表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,即动态解析字符串中的值会使事情变得更加困难。

从-

在SQL中,从UDF返回多个值相当容易 但我们必须将这些值作为虚拟表返回


谢谢你的回复。如果我想返回2个声明的变量呢?@John返回选择@Var1、@Var2有什么问题吗?
--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