使用带函数的变量 - SQL

Posted

技术标签:

【中文标题】使用带函数的变量 - SQL【英文标题】:Using Variable with function - SQL 【发布时间】:2012-02-07 11:14:26 【问题描述】:

我有返回表格的自定义函数 它接受两个 varchar,它根据分隔符拆分 varchar

SELECT VALUE FROM dbo.Split('xxx','_') --- working

select abc from abcd a,cde b where a.abc like (SELECT VALUE FROM dbo.Split(b.abc,'_'))-- not working


select abc from abcd a,cde b where a.abc like (SELECT VALUE FROM dbo.Split('xx','_'))-- working

select abc from abcd a,cde b where a.abc like (SELECT b.abc)-- working

如何让不工作的案例发挥作用。

错误我明白了 '.' 附近的语法不正确。

【问题讨论】:

我确定你也想问一个问题...? 表b中abc的列类型是什么? @MikaelEriksson 他想知道为什么这种情况不起作用,请检查 cmets。 我们可以看看你的dbo.Split()函数代码 如果您使用一些导致错误的示例数据更新您的问题,并且请添加错误消息,这将有所帮助。我猜你会得到类似“子查询返回超过 1 个值。”的东西。尝试将like 改为in。它可能会做你想做的事。 【参考方案1】:

使用CROSS APPLY 允许您将变量用作函数的参数。

SELECT abc
FROM   abcd a
       , cde b
       CROSS APPLY (select VALUE from dbo.Split(b.abc, '_')) f
WHERE  a.abc LIKE f.Value

SELECT  *
FROM    abcd a
        , cde b        
        CROSS APPLY dbo.Split(b.abc, '_') f
WHERE   a.abc LIKE f.Value

APPLY 运算符允许您调用表值函数 查询的外部表表达式返回的每一行。

测试脚本

CREATE FUNCTION dbo.Split(@a VARCHAR(4), @b VARCHAR(4)) 
RETURNS TABLE 
AS RETURN
(
  SELECT Value = 'Test'  
)
GO

;WITH abcd (abc) AS (
  SELECT 'Test'
)
, cde (abc) AS (
  SELECT 'Test'
)  
SELECT  *
FROM    abcd a
        , cde b        
        CROSS APPLY (SELECT Value FROM dbo.Split(b.abc, '_')) f
WHERE   a.abc LIKE f.Value

【讨论】:

SELECT * FROM tablesxx c,tableyyy y CROSS APPLY (SELECT TOP 1 VALUE FROM dbo.Split(x.abc,'_')) f WHERE x.abc LIKE f.value '附近的语法不正确申请'。 '.' 附近的语法不正确。 @user1178514 - 我错过了一个)。答案已更正。 非常感谢。它现在可以工作了..CROSS APPLY 不起作用,因为我在 SQL SERVER 2000 上...所以我使用了另一种方法,显然您建议 ***.com/questions/4644740/… @user1178514 - 从您的问题中不清楚只返回一个结果,但如果它对您有用,您可以将其标记为已回答并支持我的另一个答案:)。见How does accepting an answer works 标记为已回答...不能投票已经获得了那么高的声誉...最近加入【参考方案2】:

你试过了吗:

select abc 
from abcd a, cde b 
where a.abc like dbo.Split(b.abc,'_')

【讨论】:

当我这样调用该函数时,它会返回一个表,它会引发无效对象名称错误。

以上是关于使用带函数的变量 - SQL的主要内容,如果未能解决你的问题,请参考以下文章

带变量的 SQL 编译语句的 SparkSQL 等效项

带变量的复杂sql查询

接收带变量的 HTTP 请求,查询 BQ 并返回响应

SQL Server 将变量 varchar 字段转换为货币/小数/带小数位的东西

xts 变量带“-”

将带引号的变量传递给React中的函数