2015-01-28 6 views
0

У меня есть следующий запрос:запросов хранятся в NVARCHAR (MAX) не подходит

DECLARE @query AS NVARCHAR(MAX); 
SET @query =' 

SELECT 

col1 [TÜR], 
col2 [KOD], 
col3 [BANKA/CARİ], 
col4 [BANKA HESABI], 
col5 [AÇIKLAMA], 
col6 [VADE], 
'+ @cols +' 

FROM 

(

(

SELECT 
''LEASİNG'' [col1], 
d.REGNR [col2], 
cl.DEFINITION_ [col3], 
'''' [col4], 
d.DESCRIPTION [col5], 
c.PAYMENTDATE [col6], 
a.KDVLI- Isnull(b.KDVLI,0) [AMOUNT], 
c.TRCURR [TRCURR], 
e.CURCODE [CURCODE] 


FROM 
(SELECT 
LOGICALREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 

FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=0 
GROUP BY LOGICALREF) a 

LEFT OUTER JOIN 

(SELECT 
PARENTREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 
FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=1 
GROUP BY PARENTREF 
) b 
ON a.LOGICALREF= b.PARENTREF 

INNER JOIN 
LG_011_LEASINGPAYMENTSLNS c 
ON a.LOGICALREF=c.LOGICALREF 


INNER JOIN 

LG_011_LEASINGREG d 
ON c.LEASINGREF=d.LOGICALREF 

INNER JOIN 
LG_011_PURCHOFFER z 
ON c.LEASINGREF=z.LEASINGREF 

INNER JOIN 
(SELECT 
MAX(LOGICALREF) LOGICALREF, 
LEASINGREF, 
CLIENTREF 
FROM LG_011_PURCHOFFER 
GROUP BY CLIENTREF,LEASINGREF) y 
ON z.LOGICALREF=y.LOGICALREF 

INNER JOIN LG_011_CLCARD cl 
ON z.CLIENTREF=cl.LOGICALREF 

INNER JOIN L_CURRENCYLIST e 
ON c.TRCURR=e.CURTYPE OR (c.TRCURR=0 AND e.CURTYPE=160) 


WHERE e.FIRMNR=11 AND z.STATUS=4 AND a.KDVLI - Isnull(b.KDVLI,0)<>0 

) 

UNION ALL 

(

SELECT 
''ÇEK'', 
cs.NEWSERINO, 
bn.DEFINITION_, 
ban.DEFINITION_, 
cl.DEFINITION_, 
cs.DUEDATE, 
cs.AMOUNT, 
cs.TRCURR, 
cur.CURCODE 

FROM 

LG_011_01_CSTRANS a 

INNER JOIN 

(
SELECT 
CSREF, 
MAX(STATNO) [STATNO] 

FROM LG_011_01_CSTRANS 
GROUP BY CSREF) b 
ON a.CSREF=b.CSREF AND a.STATNO=b.STATNO 

INNER JOIN LG_011_01_CSCARD cs ON a.CSREF=cs.LOGICALREF 
INNER JOIN LG_011_BANKACC ban ON cs.OURBANKREF=ban.LOGICALREF 
INNER JOIN LG_011_BNCARD bn ON ban.BANKREF=bn.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON cs.TRCURR=cur.CURTYPE OR (cs.TRCURR=0 AND cur.CURTYPE=160) 
INNER JOIN LG_011_CLCARD cl ON a.CARDREF=cl.LOGICALREF 

WHERE cs.DOC=3 AND cs.CURRSTAT=9 AND cur.FIRMNR=11 

) 

UNION ALL 

(

SELECT 
CASE WHEN cl.SPECODE=''OTOMATİK'' THEN ''OTOMATİK ÖDEME'' WHEN cl.SPECODE=''ZORUNLU'' THEN ''ZORUNLU CARİ'' END, 
CASE WHEN pt.MODULENR=5 AND pt.TRCODE=14 THEN clf.DOCODE WHEN pt.MODULENR=5 AND pt.TRCODE<>14 THEN clf.TRANNO ELSE inv.FICHENO END, 
cl.DEFINITION_, 
'''', 
'''', 
pt.DATE_, 
pt.TOTAL, 
pt.TRCURR, 
cur.CURCODE 

FROM LG_011_01_PAYTRANS pt 
INNER JOIN LG_011_CLCARD cl ON pt.CARDREF=cl.LOGICALREF 
LEFT OUTER JOIN LG_011_01_INVOICE inv ON pt.FICHEREF=inv.LOGICALREF 
LEFT OUTER JOIN LG_011_01_CLFLINE clf ON pt.FICHEREF=clf.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON pt.TRCURR=cur.CURTYPE OR (pt.TRCURR=0 AND cur.CURTYPE=160) 

WHERE pt.MODULENR IN (4,5) AND pt.PAID=0 AND pt.SIGN=1 AND cl.CODE LIKE ''320%'' AND cl.SPECODE IN (''OTOMATİK'',''ZORUNLU'') AND cur.FIRMNR=11 

) 

UNION ALL 

(
SELECT 
CASE d.SPECODE WHEN '''' THEN ''KREDİ'' WHEN ''FORWARD'' THEN ''FORWARD'' END [TÜR], 
d.CODE, 
f.DEFINITION_, 
g.DEFINITION_, 
d.NAME_, 
b.DUEDATE, 
a.TAKSIT - Isnull(c.TAKSIT,0) AS TAKSIT, 
d.TRCURR, 
e.CURCODE 

FROM 
    (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 

     FROM LG_011_BNCREPAYTR 
     WHERE TRANSTYPE = 0 
     GROUP BY PARENTREF) a 
INNER JOIN (SELECT 
LOGICALREF, 
PARENTREF, 
CREDITREF, 
DUEDATE, 
OPRDATE 
FROM LG_011_BNCREPAYTR 
       WHERE TRANSTYPE = 0) b 
ON a.PARENTREF=b.PARENTREF 

LEFT OUTER JOIN (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 
     FROM LG_011_BNCREPAYTR 
     WHERE TRANSTYPE = 1 
     GROUP BY PARENTREF) c 
ON b.LOGICALREF = c.PARENTREF 

INNER JOIN LG_011_BNCREDITCARD d 
ON b.CREDITREF=d.LOGICALREF 

INNER JOIN L_CURRENCYLIST e 
ON d.TRCURR=e.CURTYPE OR (d.TRCURR=0 AND e.CURTYPE=160) 

INNER JOIN LG_011_BNCARD f 
ON d.BNCRREF=f.LOGICALREF 

INNER JOIN LG_011_BANKACC g 
ON d.BNACCREF=g.LOGICALREF 

WHERE e.FIRMNR=11 AND a.TAKSIT - Isnull(c.TAKSIT,0)<>0 
) 

) x 

PIVOT 

(

SUM(AMOUNT) 
FOR CURCODE IN ('+ @cols +') 

) xx 

ORDER BY xx.col6,xx.TRCURR, xx.col1, xx.col3, xx.col4, xx.col2 
' 

При печати этого запроса с помощью print @query, я получаю следующее, с последней частью моего кода отрезана:

SELECT 

col1 [TÜR], 
col2 [KOD], 
col3 [BANKA/CARİ], 
col4 [BANKA HESABI], 
col5 [AÇIKLAMA], 
col6 [VADE], 
[TL],[USD],[EUR] 

FROM 

(

(

SELECT 
'LEASİNG' [col1], 
d.REGNR [col2], 
cl.DEFINITION_ [col3], 
'' [col4], 
d.DESCRIPTION [col5], 
c.PAYMENTDATE [col6], 
a.KDVLI- Isnull(b.KDVLI,0) [AMOUNT], 
c.TRCURR [TRCURR], 
e.CURCODE [CURCODE] 


FROM 
(SELECT 
LOGICALREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 

FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=0 
GROUP BY LOGICALREF) a 

LEFT OUTER JOIN 

(SELECT 
PARENTREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 
FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=1 
GROUP BY PARENTREF 
) b 
ON a.LOGICALREF= b.PARENTREF 

INNER JOIN 
LG_011_LEASINGPAYMENTSLNS c 
ON a.LOGICALREF=c.LOGICALREF 


INNER JOIN 

LG_011_LEASINGREG d 
ON c.LEASINGREF=d.LOGICALREF 

INNER JOIN 
LG_011_PURCHOFFER z 
ON c.LEASINGREF=z.LEASINGREF 

INNER JOIN 
(SELECT 
MAX(LOGICALREF) LOGICALREF, 
LEASINGREF, 
CLIENTREF 
FROM LG_011_PURCHOFFER 
GROUP BY CLIENTREF,LEASINGREF) y 
ON z.LOGICALREF=y.LOGICALREF 

INNER JOIN LG_011_CLCARD cl 
ON z.CLIENTREF=cl.LOGICALREF 

INNER JOIN L_CURRENCYLIST e 
ON c.TRCURR=e.CURTYPE OR (c.TRCURR=0 AND e.CURTYPE=160) 


WHERE e.FIRMNR=11 AND z.STATUS=4 AND a.KDVLI - Isnull(b.KDVLI,0)<>0 

) 

UNION ALL 

(

SELECT 
'ÇEK', 
cs.NEWSERINO, 
bn.DEFINITION_, 
ban.DEFINITION_, 
cl.DEFINITION_, 
cs.DUEDATE, 
cs.AMOUNT, 
cs.TRCURR, 
cur.CURCODE 

FROM 

LG_011_01_CSTRANS a 

INNER JOIN 

(
SELECT 
CSREF, 
MAX(STATNO) [STATNO] 

FROM LG_011_01_CSTRANS 
GROUP BY CSREF) b 
ON a.CSREF=b.CSREF AND a.STATNO=b.STATNO 

INNER JOIN LG_011_01_CSCARD cs ON a.CSREF=cs.LOGICALREF 
INNER JOIN LG_011_BANKACC ban ON cs.OURBANKREF=ban.LOGICALREF 
INNER JOIN LG_011_BNCARD bn ON ban.BANKREF=bn.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON cs.TRCURR=cur.CURTYPE OR (cs.TRCURR=0 AND cur.CURTYPE=160) 
INNER JOIN LG_011_CLCARD cl ON a.CARDREF=cl.LOGICALREF 

WHERE cs.DOC=3 AND cs.CURRSTAT=9 AND cur.FIRMNR=11 

) 

UNION ALL 

(

SELECT 
CASE WHEN cl.SPECODE='OTOMATİK' THEN 'OTOMATİK ÖDEME' WHEN cl.SPECODE='ZORUNLU' THEN 'ZORUNLU CARİ' END, 
CASE WHEN pt.MODULENR=5 AND pt.TRCODE=14 THEN clf.DOCODE WHEN pt.MODULENR=5 AND pt.TRCODE<>14 THEN clf.TRANNO ELSE inv.FICHENO END, 
cl.DEFINITION_, 
'', 
'', 
pt.DATE_, 
pt.TOTAL, 
pt.TRCURR, 
cur.CURCODE 

FROM LG_011_01_PAYTRANS pt 
INNER JOIN LG_011_CLCARD cl ON pt.CARDREF=cl.LOGICALREF 
LEFT OUTER JOIN LG_011_01_INVOICE inv ON pt.FICHEREF=inv.LOGICALREF 
LEFT OUTER JOIN LG_011_01_CLFLINE clf ON pt.FICHEREF=clf.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON pt.TRCURR=cur.CURTYPE OR (pt.TRCURR=0 AND cur.CURTYPE=160) 

WHERE pt.MODULENR IN (4,5) AND pt.PAID=0 AND pt.SIGN=1 AND cl.CODE LIKE '320%' AND cl.SPECODE IN ('OTOMATİK','ZORUNLU') AND cur.FIRMNR=11 

) 

UNION ALL 

(
SELECT 
CASE d.SPECODE WHEN '' THEN 'KREDİ' WHEN 'FORWARD' THEN 'FORWARD' END [TÜR], 
d.CODE, 
f.DEFINITION_, 
g.DEFINITION_, 
d.NAME_, 
b.DUEDATE, 
a.TAKSIT - Isnull(c.TAKSIT,0) AS TAKSIT, 
d.TRCURR, 
e.CURCODE 

FROM 
    (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 

     FROM LG_011_BNCREPAYTR 
     WHERE TRANSTYPE = 0 
     GROUP BY PARENTREF) a 
INNER JOIN (SELECT 
LOGICALREF, 
PARENTREF, 
CREDITREF, 
DUEDATE, 
OPRDATE 
FROM LG_011_BNCREPAYTR 
       WHERE TRANSTYPE = 0) b 
ON a.PARENTREF=b.PARENTREF 

LEFT OUTER JOIN (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 
     FROM LG_011_BNCREPAYTR 

Как я могу поместить весь свой запрос внутри @query, чтобы я мог выполнить его правильно? Примечание. Утверждение NoDisplayName, что запрос будет работать независимо, не соответствует действительности, как я пробовал. Я удалил все ненужные пробелы и урезал свой код (при уменьшении функциональности), и он работает. Поэтому способ подгонки кода к @query оценивается!

Спасибо!


Когда я разделить код на две части, запрос выполняется без каких-либо проблем:

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @query2 AS NVARCHAR(MAX); 

SET @cols= STUFF((SELECT ','+QUOTENAME(c.CURCODE) FROM (

(

SELECT DISTINCT b.CURCODE,a.TRCURR FROM LG_011_BNCREDITCARD a INNER JOIN L_CURRENCYLIST b 
ON a.TRCURR=b.CURTYPE OR (a.TRCURR=0 AND b.CURTYPE=160) 

) 

UNION 

(

SELECT DISTINCT b.CURCODE,a.TRCURR 

FROM LG_011_LEASINGPAYMENTSLNS a 

INNER JOIN LG_011_PURCHOFFER z 
ON a.LEASINGREF=z.LEASINGREF 

INNER JOIN 
(SELECT 
MAX(LOGICALREF) LOGICALREF, 
LEASINGREF 
FROM LG_011_PURCHOFFER 
GROUP BY LEASINGREF) y 
ON z.LOGICALREF=y.LOGICALREF 

INNER JOIN L_CURRENCYLIST b 
ON a.TRCURR=b.CURTYPE OR (a.TRCURR=0 AND b.CURTYPE=160) 

WHERE z.STATUS=4 

) 

UNION 

(

SELECT DISTINCT cur.CURCODE,cs.TRCURR FROM 

LG_011_01_CSTRANS a 

INNER JOIN 

(
SELECT 
CSREF, 
MAX(STATNO) [STATNO] 

FROM LG_011_01_CSTRANS 
GROUP BY CSREF) b 
ON a.CSREF=b.CSREF AND a.STATNO=b.STATNO 

INNER JOIN LG_011_01_CSCARD cs ON a.CSREF=cs.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON cs.TRCURR=cur.CURTYPE OR (cs.TRCURR=0 AND cur.CURTYPE=160) 

WHERE cs.DOC=3 AND cs.CURRSTAT=9 AND cur.FIRMNR=11 

) 

UNION 

(

SELECT DISTINCT cur.CURCODE, pt.TRCURR 

FROM LG_011_01_PAYTRANS pt 
INNER JOIN LG_011_CLCARD cl ON pt.CARDREF=cl.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON pt.TRCURR=cur.CURTYPE OR (pt.TRCURR=0 AND cur.CURTYPE=160) 

WHERE pt.MODULENR IN (4,5) AND pt.PAID=0 AND pt.SIGN=1 AND cl.CODE LIKE '320%' AND cl.SPECODE IN ('OTOMATİK','ZORUNLU') 

) 

) c ORDER BY c.TRCURR FOR XML PATH(''), TYPE 
).value('.','NVARCHAR(MAX)'),1,1,'') 


SET @query =' 

SELECT 

col1 [TÜR], 
col2 [KOD], 
col3 [BANKA/CARİ], 
col4 [BANKA HESABI], 
col5 [AÇIKLAMA], 
col6 [VADE], 
'+ @cols +' 

FROM 

(

(

SELECT 
''LEASİNG'' [col1], 
d.REGNR [col2], 
cl.DEFINITION_ [col3], 
'''' [col4], 
d.DESCRIPTION [col5], 
c.PAYMENTDATE [col6], 
a.KDVLI- Isnull(b.KDVLI,0) [AMOUNT], 
c.TRCURR [TRCURR], 
e.CURCODE [CURCODE] 


FROM 
(SELECT 
LOGICALREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 

FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=0 
GROUP BY LOGICALREF) a 

LEFT OUTER JOIN 

(SELECT 
PARENTREF, 
SUM(PAYMENTTOTAL) AS KDVSIZ, 
SUM(INTTOTAL) AS FAIZ, 
SUM(MAINTOTAL) AS ANAPARA, 
SUM(VATINPAYMENTTOTAL-PAYMENTTOTAL) AS KDV, 
SUM(VATINPAYMENTTOTAL) AS KDVLI 
FROM LG_011_LEASINGPAYMENTSLNS 
WHERE TRANSTYPE=1 
GROUP BY PARENTREF 
) b 
ON a.LOGICALREF= b.PARENTREF 

INNER JOIN 
LG_011_LEASINGPAYMENTSLNS c 
ON a.LOGICALREF=c.LOGICALREF 


INNER JOIN 

LG_011_LEASINGREG d 
ON c.LEASINGREF=d.LOGICALREF 

INNER JOIN 
LG_011_PURCHOFFER z 
ON c.LEASINGREF=z.LEASINGREF 

INNER JOIN 
(SELECT 
MAX(LOGICALREF) LOGICALREF, 
LEASINGREF, 
CLIENTREF 
FROM LG_011_PURCHOFFER 
GROUP BY CLIENTREF,LEASINGREF) y 
ON z.LOGICALREF=y.LOGICALREF 

INNER JOIN LG_011_CLCARD cl 
ON z.CLIENTREF=cl.LOGICALREF 

INNER JOIN L_CURRENCYLIST e 
ON c.TRCURR=e.CURTYPE OR (c.TRCURR=0 AND e.CURTYPE=160) 


WHERE e.FIRMNR=11 AND z.STATUS=4 AND a.KDVLI - Isnull(b.KDVLI,0)<>0 

) 

UNION ALL 

(

SELECT 
''ÇEK'', 
cs.NEWSERINO, 
bn.DEFINITION_, 
ban.DEFINITION_, 
cl.DEFINITION_, 
cs.DUEDATE, 
cs.AMOUNT, 
cs.TRCURR, 
cur.CURCODE 

FROM 

LG_011_01_CSTRANS a 

INNER JOIN 

(
SELECT 
CSREF, 
MAX(STATNO) [STATNO] 

FROM LG_011_01_CSTRANS 
GROUP BY CSREF) b 
ON a.CSREF=b.CSREF AND a.STATNO=b.STATNO 

INNER JOIN LG_011_01_CSCARD cs ON a.CSREF=cs.LOGICALREF 
INNER JOIN LG_011_BANKACC ban ON cs.OURBANKREF=ban.LOGICALREF 
INNER JOIN LG_011_BNCARD bn ON ban.BANKREF=bn.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON cs.TRCURR=cur.CURTYPE OR (cs.TRCURR=0 AND cur.CURTYPE=160) 
INNER JOIN LG_011_CLCARD cl ON a.CARDREF=cl.LOGICALREF 

WHERE cs.DOC=3 AND cs.CURRSTAT=9 AND cur.FIRMNR=11 

) 

UNION ALL 

(

SELECT 
CASE WHEN cl.SPECODE=''OTOMATİK'' THEN ''OTOMATİK ÖDEME'' WHEN cl.SPECODE=''ZORUNLU'' THEN ''ZORUNLU CARİ'' END, 
CASE WHEN pt.MODULENR=5 AND pt.TRCODE=14 THEN clf.DOCODE WHEN pt.MODULENR=5 AND pt.TRCODE<>14 THEN clf.TRANNO ELSE inv.FICHENO END, 
cl.DEFINITION_, 
'''', 
'''', 
pt.DATE_, 
pt.TOTAL, 
pt.TRCURR, 
cur.CURCODE 

FROM LG_011_01_PAYTRANS pt 
INNER JOIN LG_011_CLCARD cl ON pt.CARDREF=cl.LOGICALREF 
LEFT OUTER JOIN LG_011_01_INVOICE inv ON pt.FICHEREF=inv.LOGICALREF 
LEFT OUTER JOIN LG_011_01_CLFLINE clf ON pt.FICHEREF=clf.LOGICALREF 
INNER JOIN L_CURRENCYLIST cur ON pt.TRCURR=cur.CURTYPE OR (pt.TRCURR=0 AND cur.CURTYPE=160) 

WHERE pt.MODULENR IN (4,5) AND pt.PAID=0 AND pt.SIGN=1 AND cl.CODE LIKE ''320%'' AND cl.SPECODE IN (''OTOMATİK'',''ZORUNLU'') AND cur.FIRMNR=11 
' 



SET @query2=' 

) 

UNION ALL 

(
SELECT 
CASE d.SPECODE WHEN '''' THEN ''KREDİ'' WHEN ''FORWARD'' THEN ''FORWARD'' END [TÜR], 
d.CODE, 
f.DEFINITION_, 
g.DEFINITION_, 
d.NAME_, 
b.DUEDATE, 
a.TAKSIT - Isnull(c.TAKSIT,0) AS TAKSIT, 
d.TRCURR, 
e.CURCODE 

FROM 
    (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 

     FROM LG_011_BNCREPAYTR 
     WHERE TRANSTYPE = 0 
     GROUP BY PARENTREF) a 
INNER JOIN (SELECT 
LOGICALREF, 
PARENTREF, 
CREDITREF, 
DUEDATE, 
OPRDATE 
FROM LG_011_BNCREPAYTR 
       WHERE TRANSTYPE = 0) b 
ON a.PARENTREF=b.PARENTREF 

LEFT OUTER JOIN (SELECT 
PARENTREF, 
SUM(TOTAL) AS ANAPARA, 
SUM(INTTOTAL) AS FAIZ, 
SUM(BSMVTOTAL) AS BSMV, 
SUM(KKDFTOTAL) AS KKDF, 
SUM(TOTAL+INTTOTAL+BSMVTOTAL+KKDFTOTAL) AS TAKSIT 
     FROM LG_011_BNCREPAYTR 
     WHERE TRANSTYPE = 1 
     GROUP BY PARENTREF) c 
ON b.LOGICALREF = c.PARENTREF 

INNER JOIN LG_011_BNCREDITCARD d 
ON b.CREDITREF=d.LOGICALREF 

INNER JOIN L_CURRENCYLIST e 
ON d.TRCURR=e.CURTYPE OR (d.TRCURR=0 AND e.CURTYPE=160) 

INNER JOIN LG_011_BNCARD f 
ON d.BNCRREF=f.LOGICALREF 

INNER JOIN LG_011_BANKACC g 
ON d.BNACCREF=g.LOGICALREF 

WHERE e.FIRMNR=11 AND a.TAKSIT - Isnull(c.TAKSIT,0)<>0 
) 

) x 

PIVOT 

(

SUM(AMOUNT) 
FOR CURCODE IN ('+ @cols +') 

) xx 

ORDER BY xx.col6,xx.TRCURR, xx.col1, xx.col3, xx.col4, xx.col2 
' 

EXECUTE(@query + @query2) 
+2

Какая ошибка возникает при выполнении? – dotjoe

+0

'Msg 102, Level 15, State 1, Line 205 Неверный синтаксис рядом с ','.' Но ошибка изменяется, когда я добавляю, удаляю пробелы. Когда я очень стараюсь подстроить код внутри, он работает. – SQLfreaq

+0

Как вы выполняете '@ query'? sp_executesql?Похоже, вы пытаетесь выполнить результат 'print @ query', который не будет работать из-за ограничений инструкции' print'. Попробуйте использовать 'sp_executesql @ query' – dotjoe

ответ

1

Я ударил это раньше (хотя с varchar (max)). Ниже приведен пример работы, с которой мы столкнулись. Это одна из тех ситуаций, когда я могу понять, почему SQL это делает, но я не могу это объяснить, не говоря уже о том, почему именно так работает. (Google вокруг достаточно, и вы, вероятно, найти техническое объяснение, если вы можете выяснить правильные условия поиска.)

Предполагая, что эти переменные:

DECLARE 
    @Query AS NVARCHAR(MAX) 
,@Cols nvarchar(10) 

SET @Cols = 'A, B, C, D, E' 

Установите команду следующим образом:

SET @Query = replace(cast('' as varchar(max)) 
         + 'Big chunk of text containing <@Cols> wherever you need to substitute in that string' 
        ,'<@Cols>' 
        ,@Cols) 

следующие проверки результатов (LEN <> длина_данных, когда вы работаете с nvarchars)

PRINT @Query 
PRINT len(@query) 
PRINT datalength(@query) 
+0

Решил мою проблему, но ЛЮБОВЬ, чтобы узнать причину, по которой SQL делает это, потому что мне потребовался почти день для запуска кода. – SQLfreaq

+0

@SQLfreaq Это, вероятно, потому, что вы не использовали ['N' в строковых литералах] (http://stackoverflow.com/q/10025032/11683) (вы должны были, они должны быть 'nvarchar's) и что в некоторой степени запутало сервер во время конкатенации. Действительно, с вашим исходным кодом '@ query' хранит усеченный текст, который можно увидеть с помощью' select for xml', но если вы добавите 'N' перед каждой строкой, он будет содержать полный запрос. – GSerg

+1

@SQLfreaq Я только что понял [dotjoe] (http://stackoverflow.com/users/40822/dotjoe) уже [ответил] (http://stackoverflow.com/a/28201880/11683) именно это. Соответствующая часть ответа [связанного Мартина Смита] (http://stackoverflow.com/a/12639972/11683) находится под * Datatypes строковых литералов * subheader - один из ваших строковых литералов больше 4000 символов, но меньше 8000 , поэтому при использовании без 'N' он переходит к' nvarchar (4000) 'и вызывает усечение, но с' N' он приписывает 'nvarchar (max)' и не усекает. Вместо этого вы должны принять этот ответ. – GSerg

5

От MSDN

Строка сообщения может быть длиной до 8000 символов, если ему является строкой non-Unicode и длиной 4000 символов, если это строка Unicode . Более длинные строки усекаются. VARCHAR (макс) и NVARCHAR (макс) типы данных усечены типам данных, которые не больше, чем VARCHAR (8000) и NVARCHAR (4000)

Даже если печать не показывает весь свой запрос , Query выполнит

+0

Но это не выполняется! Если я удалю некоторые его части (например, один из UNION ALL), он будет выполнен. Так что есть проблема. – SQLfreaq

+1

@SQLfreaq Оператор 'print' не распечатывает полный текст, но' sp_executesql' будет обрабатывать [до 2gb строки запроса] (https://msdn.microsoft.com/en-us/library/ms188001.aspx) , Если этого не произойдет, есть что-то еще неправильное. – GSerg

+0

Как я могу интегрировать sp_executesql в свой код? – SQLfreaq

3

@Martin Smith posted a link ответ ... Это связано с усечением, когда вы объединяете строки sql с переменной @cols. Если вы измените свои строки на использование префикса N, они будут рассматриваться как nvarchars и конкатенация без усечения. Причина, по которой он работает в предоставленном вами образце, заключается в том, что @query2 предотвратил возникновение усечения, так как вы разбили их до размеров менее 4000 символов.