【问题标题】:Using Variable with function - SQL使用带函数的变量 - 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。它可能会做你想做的事。

标签: sql sql-server-2008 sql-server-2005 user-defined-functions


【解决方案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 上...所以我使用了另一种方法,显然您建议 stackoverflow.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,'_')

【讨论】:

  • 当我这样调用该函数时,它会返回一个表,它会引发无效对象名称错误。
猜你喜欢
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多