【发布时间】:2016-10-25 15:27:05
【问题描述】:
我有一个运行大查询的存储过程 (SP),当我在 Microsoft SQL Server Management Studio 2014 中使用默认参数执行或调试它时,它运行良好。问题是下一个。当这个 SP 在 VS 2008 的报告服务工具的“预览”选项卡中从 SSRS 执行时,我设置了相同的默认参数,出现此错误:
'+ replicate(' 附近的语法不正确。字符串') 后面的非闭合引号按1'排序。
这是我的全部代码:
set @vlcc_condicitmp = 'where (dfechamovi between convert(datetime,'''+@vlcc_dfechainic+''',103) and convert(datetime,'''+ @vlcc_dfechafina+''',103))'
set @vlcc_condici6 = ' order by '+@vlcc_orden
set @sentsql1_expresion = 'SELECT inmovinven.cnumproduc,Cast ('' '' as char) as nconsresol,inmovinven.ccodmovinv,'+
'inmovinven.ctipodocum,inmovinven.cllavedocu,'+
'inmovinven.dfechamovi,inmovinven.cunimedida,'+
'inmovinven.ncantidad,inmovinven.ccodbodega,'+
'inmovinven.ccodbodego,inmovinven.npreciouni,'+
'inmovinven.npreciotot,inmovinven.nexistante,'+
'inmovinven.nexistdesp,inmovinven.nprecioant,'+
'inmovinven.npreciodes,inmovinven.ctipasient,'+
'inmovinven.cnumasient,inmovinven.ccuentacon,'+
'inmovinven.cdescripci,cpdocument.cnumdocume,inproducto.cnumeserie,'+
'inproducto.cnomproduc,inproducto.ccateprodu,inproducto.clocalizac,'+
'fadocument.cnumdocume as cnumfactur,intipmovin.ctipoperad, '+
'inmovinven.ccodigousu,intipmovin.cdesmovimi,inmovinven.cconseajus,'' '' as cnomunidad '+
'FROM #inmovintmp as inmovinven LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inmovinven.cllavedocu = cpdocument.cllavedocu INNER JOIN '+
+@basdeDatos+'.dbo.'+'inproducto ON inmovinven.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fadocument on inmovinven.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fadocument.nconsdocum))+ltrim(str(fadocument.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inmovinven.ccodmovinv = intipmovin.ccodmovinv '+ @vlcc_condicitmp + @vlcc_condici1 +' and inmovinven.ncantidad > 0'
set @sentsql2_expresion = 'SELECT inhmovinve.cnumproduc,Cast ('' '' as char) as nconsresol,inhmovinve.ccodmovinv,'+
'inhmovinve.ctipodocum,inhmovinve.cllavedocu,'+
'inhmovinve.dfechamovi,inhmovinve.cunimedida,'+
'inhmovinve.ncantidad,inhmovinve.ccodbodega,'+
'inhmovinve.ccodbodego,inhmovinve.npreciouni,'+
'inhmovinve.npreciotot,inhmovinve.nexistante,'+
'inhmovinve.nexistdesp,inhmovinve.nprecioant,'+
'inhmovinve.npreciodes,inhmovinve.ctipasient,'+
'inhmovinve.cnumasient,inhmovinve.ccuentacon,'+
'inhmovinve.cdescripci,cpdocument.cnumdocume,inproducto.cnumeserie,'+
'inproducto.cnomproduc,inproducto.ccateprodu,inproducto.clocalizac,'+
'fahdocumen.cnumdocume as cnumfactur,'+
'intipmovin.ctipoperad,inhmovinve.ccodigousu,intipmovin.cdesmovimi,inhmovinve.cconseajus,'''' as cnomunidad '+
'FROM #inhmovitmp as inhmovinve LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inhmovinve.cllavedocu = cpdocument.cllavedocu INNER JOIN '+
+@basdeDatos+'.dbo.'+'inproducto ON inhmovinve.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fahdocumen on inhmovinve.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fahdocumen.nconsdocum))+ltrim(str(fahdocumen.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inhmovinve.ccodmovinv = intipmovin.ccodmovinv ' + @vlcc_condicitmp + @vlcc_condici2 +' and inhmovinve.ncantidad > 0'
IF (@vlcc_ctipoperad = 'I' OR @vlcc_ctipoperad = 'T')
BEGIN
SET @sentsql3_expresion = 'SELECT inmovinven.cnumproduc,Cast ('' '' as char) as nconsresol,inmovinven.ccodmovinv,'+
'inmovinven.ctipodocum, inmovinven.cllavedocu,'+
'inmovinven.dfechamovi, inmovinven.cunimedida,'+
'inmovinven.ncantidad as ncantida,inmovinven.ccodbodega as ccodbodega,'+
'inmovinven.ccodbodego, inmovinven.npreciouni,'+
'inmovinven.npreciotot, inmovinven.nexistante,'+
'inmovinven.nexistdesp, inmovinven.nprecioant,'+
'inmovinven.npreciodes, inmovinven.ctipasient,'+
'inmovinven.cnumasient, inmovinven.ccuentacon,'+
'inmovinven.cdescripci, cpdocument.cnumdocume,inproducto.cnumeserie,'+
'inproducto.cnomproduc, inproducto.ccateprodu,inproducto.clocalizac,'+
'fadocument.cnumdocume as cnumfactur, intipmovin.ctipoperad,'+
'inmovinven.ccodigousu,intipmovin.cdesmovimi,inmovinven.cconseajus,'' '' as cnomunidad '+
'FROM #inmovintmp as inmovinven LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inmovinven.cllavedocu = cpdocument.cllavedocu INNER JOIN '
+@basdeDatos+'.dbo.'+'inproducto ON inmovinven.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fadocument on inmovinven.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fadocument.nconsdocum))+ltrim(str(fadocument.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inmovinven.ccodmovinv = intipmovin.ccodmovinv '+
+ @vlcc_condicitmp + @vlcc_condici3+' AND inmovinven.ccodbodego <> '' '' and inmovinven.ncantidad < 0'
END
ELSE
BEGIN
SET @sentsql3_expresion = 'SELECT inmovinven.cnumproduc,Cast ('' '' as char) as nconsresol,'+@basdeDatos+'.dbo.'+'inmovinven.ccodmovinv,'+
'inmovinven.ctipodocum, inmovinven.cllavedocu,'+
'inmovinven.dfechamovi, inmovinven.cunimedida,'+
'inmovinven.ncantidad * -1 as ncantidad, inmovinven.ccodbodego as ccodbodega,'+
'inmovinven.ccodbodego, inmovinven.npreciouni,'+
'inmovinven.npreciotot, inmovinven.nexistante,'+
'inmovinven.nexistdesp, inmovinven.nprecioant,'+
'inmovinven.npreciodes, inmovinven.ctipasient,'+
'inmovinven.cnumasient, inmovinven.ccuentacon,'+
'inmovinven.cdescripci, cpdocument.cnumdocume, inproducto.cnumeserie,'+
'inproducto.cnomproduc, inproducto.ccateprodu, inproducto.clocalizac,'+
'fadocument.cnumdocume as cnumfactur, intipmovin.ctipoperad,'+
'inmovinven.ccodigousu, intipmovin.cdesmovimi,inmovinven.cconseajus,'''' as cnomunidad '+
'FROM #inmovintmp as inmovinven LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inmovinven.cllavedocu = cpdocument.cllavedocu INNER JOIN '+
+@basdeDatos+'.dbo.'+'inproducto ON inmovinven.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fadocument on inmovinven.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fadocument.nconsdocum))+ltrim(str(fadocument.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inmovinven.ccodmovinv = intipmovin.ccodmovinv '+
+@vlcc_condicitmp + @vlcc_condici1 +' AND inmovinven.ccodbodego <> '' '''
END
IF (@vlcc_ctipoperad = 'I' OR @vlcc_ctipoperad = 'T')
BEGIN
SET @sentsql4_expresion ='SELECT inhmovinve.cnumproduc,Cast ('' '' as char) as nconsresol, inhmovinve.ccodmovinv,'+
'inhmovinve.ctipodocum, inhmovinve.cllavedocu,'+
'inhmovinve.dfechamovi, inhmovinve.cunimedida,'+
'inhmovinve.ncantidad as ncantidad, inhmovinve.ccodbodega as ccodbodega,'+
'inhmovinve.ccodbodego, inhmovinve.npreciouni,'+
'inhmovinve.npreciotot, inhmovinve.nexistante,'+
'inhmovinve.nexistdesp, inhmovinve.nprecioant,'+
'inhmovinve.npreciodes, inhmovinve.ctipasient,'+
'inhmovinve.cnumasient, inhmovinve.ccuentacon,'+
'inhmovinve.cdescripci, cpdocument.cnumdocume, inproducto.cnumeserie,'+
'inproducto.cnomproduc, inproducto.ccateprodu, inproducto.clocalizac,'+
'fahdocumen.cnumdocume as cnumfactur,'+
'intipmovin.ctipoperad, inhmovinve.ccodigousu, intipmovin.cdesmovimi, inhmovinve.cconseajus,'' '' as cnomunidad '+
'FROM #inhmovitmp as inhmovinve LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inhmovinve.cllavedocu = cpdocument.cllavedocu INNER JOIN '+
'inproducto ON inhmovinve.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fahdocumen on inhmovinve.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fahdocumen.nconsdocum))+ltrim(str(fahdocumen.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inhmovinve.ccodmovinv = intipmovin.ccodmovinv '+
+ @vlcc_condicitmp +@vlcc_condici4 +' AND inhmovinve.ccodbodego <> '' '' AND inhmovinve.ncantidad < 0'
END
ELSE
BEGIN
SET @sentsql4_expresion = 'SELECT inhmovinve.cnumproduc,Cast ('' '' as char) as nconsresol, inhmovinve.ccodmovinv,'+
'inhmovinve.ctipodocum, inhmovinve.cllavedocu,'+
'inhmovinve.dfechamovi, inhmovinve.cunimedida,'+
'inhmovinve.ncantidad * - 1 as ncantidad, inhmovinve.ccodbodego as ccodbodega,'+
'inhmovinve.ccodbodego, inhmovinve.npreciouni, '+
'inhmovinve.npreciotot, inhmovinve.nexistante, '+
'inhmovinve.nexistdesp, inhmovinve.nprecioant, '+
'inhmovinve.npreciodes, inhmovinve.ctipasient, '+
'inhmovinve.cnumasient, inhmovinve.ccuentacon, '+
'inhmovinve.cdescripci, cpdocument.cnumdocume, inproducto.cnumeserie,'+
'inproducto.cnomproduc, inproducto.ccateprodu, inproducto.clocalizac,'+
'fahdocumen.cnumdocume as cnumfactur,'+
'intipmovin.ctipoperad, inhmovinve.ccodigousu, intipmovin.cdesmovimi, inhmovinve.cconseajus,'' as cnomunidad '+
'FROM #inhmovitmp as inhmovinve LEFT JOIN '+@basdeDatos+'.dbo.'+'cpdocument ON '+
'inhmovinve.cllavedocu = cpdocument.cllavedocu INNER JOIN '+
+@basdeDatos+'.dbo.'+'inproducto ON inhmovinve.cnumproduc = inproducto.cnumproduc '+
'LEFT JOIN '+@basdeDatos+'.dbo.'+'fahdocumen on inhmovinve.cllavedocu = ''VE''+ replicate('''+'0'+''',15-len(fahdocumen.nconsdocum))+ltrim(str(fahdocumen.nconsdocum)) '+
'inner join '+@basdeDatos+'.dbo.'+'intipmovin on inhmovinve.ccodmovinv = intipmovin.ccodmovinv '+
+ @vlcc_condicitmp + @vlcc_condici2 + ' AND inhmovinve.ccodbodego <> '' '''
END
IF(@vlcc_chkmovdestino ='S')
BEGIN
SET @sentsql_expresion = @sentsql1_expresion + ' union all (' + @sentsql2_expresion + ')' + @vlcc_condici6
END
ELSE
BEGIN
SET @sentsql_expresion = @sentsql1_expresion + ' union all (' + @sentsql2_expresion + ') union all (' + @sentsql3_expresion + ') union all (' + @sentsql4_expresion + ')' + @vlcc_condici6
END
SET @sentsql2_expresion = 'DROP TABLE #inmovintmp'
SET @sentsql3_expresion = 'DROP TABLE #inhmovitmp'
exec sp_executesql @sentsql_expresion
IF @@ROWCOUNT <= 0
BEGIN
exec sp_executesql @sentsql2_expresion
exec sp_executesql @sentsql3_expresion
set @vlci_errorState=1
SET @vlci_errorSeverity=16
SET @cMensajeExc ='No se puede mostrar el reporte'
SET @nIdLogExcAG = -1
RAISERROR (@cMensajeExc,@vlci_errorSeverity,@vlci_errorState)
return
END
exec sp_executesql @sentsql2_expresion
exec sp_executesql @sentsql3_expresion
请帮助我,我尝试了所有方法,但错误仍然存在。我尝试播放跳过的引号('),以为我错过了一些东西,但什么也没有。谢谢
【问题讨论】:
-
我会尝试用
''VE'''+ replicate('''更改每个''VE''+ replicate(''' -
你真的应该把它清理干净。像
'foo'+'bar'这样毫无意义的字符串构建只会让缺少引号变得容易得多。为什么不能直接使用'foobar'? -
@Lamak,我尝试了一切,现在我找到了解决方案。
标签: sql sql-server reporting-services ssrs-2008