【问题标题】:SQL Select with a function带有函数的 SQL 选择
【发布时间】:2015-02-04 10:09:37
【问题描述】:

我有以下 SQL 语句:

SELECT 
   RTRIM(LTRIM(REPLACE(LAGKART.VARENUMMER,CHAR(2),'')))                 AS ItemNo,
   RTRIM(LTRIM(REPLACE(LAGKART.SXSON,CHAR(2),'')))                          AS Season, 
   ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT1,CHAR(2),''))),'')            AS Variant1, 
   ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT2,CHAR(2),''))),'')            AS Variant2,
   (SELECT * 
    FROM [dbo].[B2BGetSpringFinal] ( LAGKART.VARENUMMER, 
                                    LAGKART.VARIANT1,
                                    LAGKART.VARIANT2
                                  )) AS SpringAvailable
FROM 
   LAGKART

但我收到此错误:

消息 170,第 15 级,状态 1,第 8 行
'.' 附近的语法不正确。

但是如果我用固定值调用函数:

SELECT 
   RTRIM(LTRIM(REPLACE(LAGKART.VARENUMMER,CHAR(2),'')))                 AS ItemNo,
   RTRIM(LTRIM(REPLACE(LAGKART.SXSON,CHAR(2),'')))                          AS Season, 
   ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT1,CHAR(2),''))),'')            AS Variant1, 
   ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT2,CHAR(2),''))),'')            AS Variant2,
   (SELECT * 
    FROM [dbo].[B2BGetSpringFinal] ( '6261', 
                                     'Black',
                                     'S'
                                   )) AS SpringAvailable
FROM 
   LAGKART   

我得到了想要的结果。

有什么想法吗?

溴 疯子

【问题讨论】:

  • 那是什么方言? TSQL?它看起来有点古怪,但对 bt mysql 来说还不够疯狂。无论如何,我很确定你不能像那样将结果列拉到子选择中。也许你想要一个 CTE?
  • 这是 T-SQL 认为你是对的,我不能在子选择中使用结果列。

标签: sql sql-server function select sql-server-2000


【解决方案1】:

在 SQL Server 2000 中,只有常量和 @local_variables 可以传递给表值函数。在 SQL 2005 及更高版本中,此问题已得到修复。您可以尝试使用标量函数来获取 SpringAvailable 列值,或者考虑升级到更新的 SQL Server 版本。

【讨论】:

  • 我可以免费从 SQL 2000 升级到 SQL Express 2005,这就是解决方案。谢谢!
【解决方案2】:

您可以使用APPLYCROSSOUTER)将列值作为参数传递给函数:

SELECT RTRIM(LTRIM(REPLACE(LAGKART.VARENUMMER,CHAR(2),'')))  AS ItemNo,
        RTRIM(LTRIM(REPLACE(LAGKART.SXSON,CHAR(2),''))) AS Season, 
        ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT1,CHAR(2),''))),'') AS Variant1, 
        ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT2,CHAR(2),''))),'') AS Variant2,
        SpringAvailable.*
FROM LAGKART
CROSS APPLY 
(
    SELECT * 
    FROM [dbo].[B2BGetSpringFinal] ( LAGKART.VARENUMMER, LAGKART.VARIANT1,LAGKART.VARIANT2 )
) AS SpringAvailable

【讨论】:

  • 感谢 gtqn。稍后会试一试。
  • 我收到以下错误:Msg 170, Level 15, State 1, Line 7 Line 7: 'APPLY' 附近的语法不正确。
  • 是旧的 SQL 版本 (SQL 2000),所以这可以解释它。
【解决方案3】:

如果你的服务器支持 CTE,你可以试试这个:

WITH a as (
SELECT VARENUMMER,
RTRIM(LTRIM(REPLACE(LAGKART.VARENUMMER,CHAR(2),'')))                    AS ItemNo,
RTRIM(LTRIM(REPLACE(LAGKART.SXSON,CHAR(2),'')))                         AS Season, 
ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT1,CHAR(2),''))),'')           AS Variant1, 
ISNULL(RTRIM(LTRIM(REPLACE(LAGKART.VARIANT2,CHAR(2),''))),'')           AS Variant2,
FROM LAGKART
)
select *,
(SELECT * FROM [dbo].[B2BGetSpringFinal] ( a.VARENUMMER, 
                                           a.VARIANT1,
                                           a.VARIANT2
                                        ))                              AS SpringAvailable
from a ;

【讨论】:

  • 谢谢杰森。稍后会试一试,然后报告。
  • 我收到以下错误:Msg 156, Level 15, State 1, Line 2 关键字'WITH'附近的语法不正确
  • WITH之前添加;
  • 这不适用于 SQL 2000 bc,因为它仍然将查询结果列值作为参数传递到 SQL 2005 之前不支持的表值函数。
猜你喜欢
  • 2017-08-03
  • 2021-10-10
  • 1970-01-01
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多