【问题标题】:Error in stored procedure while join operation加入操作时存储过程出错
【发布时间】:2014-11-09 14:03:23
【问题描述】:

我写了一个如下的存储过程

 Create table #Temp(
 TLOAID int,
 TLOAName nvarchar(50)
 );

 -- drop table #Temp;
 DECLARE @string VARCHAR(max) = 'Casualty, Insurance, Debit,';
 -- SET @string = @LOAStringParam;

 SELECT B.LOAId  AS TLOAID,
 B.LOAName TLOAName
 INTO   #temp
 FROM (SELECT Rtrim(Ltrim(Split.a.value('.', 'VARCHAR(100)'))) AS Data
 FROM (SELECT Cast ('<M>' + Replace(@string, ',', '</M><M>') + '</M>' AS XML) AS Data) AS A
 CROSS APPLY Data.nodes ('/M') AS Split(a)) a
 JOIN tbLOA B
 ON a.data = B.LOAName;

 If(exists(SELECT tbPLOA.LOAId
 FROM  tbPLOA
 WHERE tbPLOA.LOAId NOT IN(SELECT #Temp.TLOAID from #Temp) AND PId= @PId))
 BEGIN
 ....

 ....
 END
 ...

现在它会抛出类似的错误消息

'a' 附近的语法不正确。

我无法追踪这个错误!!!请帮帮我!!!

【问题讨论】:

  • 我认为您的错误来自:CROSS APPLY Data.nodes ('/M') AS Split(a)) a。我假设拆分是拆分字符串的自定义函数?也许尝试使用更有意义的完整别名。看起来您的“a”用于多种用途。
  • @RichardVivian 是对的
  • 能否在代码中解释一下
  • 这个具有相同别名的代码应该可以正常运行。在这里查看stackoverflow.com/questions/26816418/…
  • 我不认为你可以使用两次相同的别名 a 和 A

标签: sql sql-server sql-server-2008


【解决方案1】:

尝试像这样更改别名。

CREATE TABLE #Business
  (BId   INT,BName VARCHAR(50)
  )

INSERT INTO #Business
VALUES      (1,'Casualty'),(2,'Insurance'),(3,'Debit'),(4,'JKL')

DECLARE @strng VARCHAR(max) = 'Casualty, Insurance, Debit,'

SELECT B.BId   AS TBIB,
       B.BName TBName
INTO   #temp
FROM   (SELECT Rtrim(Ltrim(Split.sp.value('.', 'VARCHAR(100)'))) AS Data
        FROM   (SELECT Cast ('<M>' + Replace(@strng, ',', '</M><M>') + '</M>' AS XML) AS Data) A
               CROSS APPLY Data.nodes ('/M') AS Split(sp)) oo
       JOIN #Business B
         ON oo.data = B.BName 


SELECT *
FROM   #temp

【讨论】:

  • 现在它在'oo'附近抛出错误语法错误。
  • 在新查询部分(直接执行上述语句)可以正常工作,但在存储过程中不行
  • @Nida 能不能把有问题的SP贴一下,方便找错
  • 尝试将我的答案转换为 SP,它会正常工作。没有什么好说的,就像它在 SP 中不起作用一样。
  • 是的,你是对的,但我不确定为什么它在那里不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多