【问题标题】:Error Incorrect syntax near the keyword 'SELECT'关键字“SELECT”附近的错误语法不正确
【发布时间】:2016-08-23 10:16:31
【问题描述】:

我需要帮助。 我写了这个查询

SELECT SUM(fi.etiliquido) FROM fi WHERE fi.fno IN (
    SELECT * from divideString(
        SELECT TOP 1 REPLACE(CAST( u.nrdoc AS nvarchar),'/',',') FROM u_ups1 as u WHERE 1057 IN ( 
            SELECT * FROM divideString(REPLACE(CAST(u.nrdoc AS nvarchar),'/',','))
        )
    )
)

但是sql server返回这个错误

Msg 156, Level 15, State 1, Line 4 关键字附近的语法错误 '选择'。消息 102,级别 15,状态 1,第 7 行附近的语法不正确 ')'。

我不知道为什么。 你能帮帮我吗?

更新 divideString 是一个获取字符串并返回该字符串中的数字的函数

CREATE FUNCTION divideString (@InStr VARCHAR(MAX))
RETURNS @TempTab TABLE
   (id int not null)
AS
BEGIN
    SET @InStr = REPLACE(@InStr + ',', ',,', ',')
    DECLARE @SP INT
DECLARE @VALUE VARCHAR(1000)
WHILE PATINDEX('%,%', @INSTR ) <> 0 
BEGIN
   SELECT  @SP = PATINDEX('%,%',@INSTR)
   SELECT  @VALUE = LEFT(@INSTR , @SP - 1)
   SELECT  @INSTR = STUFF(@INSTR, 1, @SP, '')
   INSERT INTO @TempTab(id) VALUES (@VALUE)
END
    RETURN
END

【问题讨论】:

  • 什么是divideString?
  • divideString 是什么?另外,你不应该用IN 做SELECT *,而只能选择一个字段。
  • 您不能将选择作为函数的参数。
  • 我不确定你的函数是否返回。如果它返回一个表尝试将第 4 行更改为: SELECT * FROM (divideString(REPLACE(CAST(u.nrdoc AS nvarchar),'/',','))) as d
  • 我把函数放在我的问题中

标签: sql sql-server


【解决方案1】:

您需要在子查询周围加上括号(in 子查询除外),所以:

SELECT SUM(fi.etiliquido)
FROM fi
WHERE fi.fno IN (SELECT d.val
                 FROM divideString( (SELECT TOP 1 REPLACE(CAST( u.nrdoc AS nvarchar(max)), '/', ',')
                                     FROM u_ups1 as u
                                     WHERE 1057 IN (SELECT d.val
                                                    FROM divideString(REPLACE(CAST(u.nrdoc AS nvarchar(max)), '/', ',') d(val)
                                                   )
                                    )
                                   ) d(val)
                );

另外,使用TOP 而不使用ORDER BY 通常是可疑的。

不建议在单个列中存储多个值。但是,我认为您不需要为此使用表值函数。 LIKE 应该可以工作:

SELECT SUM(fi.etiliquido)
FROM fi
WHERE EXISTS (SELECT 1
              FROM (SELECT TOP 1 u.nrdoc 
                    FROM u_ups1 u
                    WHERE '/' + u.nrdoc + '/' LIKE '%/1057/%' 
                   ) u
              WHERE '/' + u.nrdoc + '/' LIKE '%/' + fi.fno + '/%'
             );

你可能想要什么:

而且,你想要的逻辑可能就这么简单:

SELECT SUM(fi.etiliquido)
FROM fi
WHERE EXISTS (SELECT 1
              FROM u_ups1 u
              WHERE '/' + u.nrdoc + '/' LIKE '%/1057/%' AND 
                    '/' + u.nrdoc + '/' LIKE '%/' + fi.fno + '/%'
             );

【讨论】:

  • @jcunham 。 . .让SELECT * 只返回一个未命名的列似乎很草率。
猜你喜欢
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多