2016-04-28 52 views
0

我需要帮助。 我写这篇文章的查询错误关键字'SELECT'附近的语法不正确

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返回该错误关键字 'SELECT'

消息156,15级,状态1,4号线附近有语法错误。 Msg 102,Level 15,State 1,Line 7在 ')'附近的语法错误。

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

UPDATE 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 
+0

什么是'divideString'? –

+2

什么是'divideString'?另外,你不应该用'IN'做一个'SELECT *',但是只能选择一个字段。 –

+1

您不能将select作为参数传递给函数。 – jarlh

回答

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 + '/%' 
      ); 
+0

为什么使用d(val)? – jcunham

+0

@jcunham。 。 。让'SELECT *'返回一个未命名的列看起来sl。不驯。 –

相关问题