When make concatenation sql string query , error has occurred because single quote - sql

SET #InventoryQuery = N'SELECT * FROM
(
SELECT Inven.Inventory_ID As ID,Inven.Inventory_ID As Number, Inventory_Date As ActionDate, ''Inventory'' AS [ActionType], IsNull(Sum(Product_Qty),0) Product_Qty, P.Product_Desc_ENG + '' ('' + P.Product_Weight + '')'' Product_Desc_ENG
FROM CRM.Product P
INNER JOIN [crm].[InventoryDetail] InvenDet ON P.Product_ID = InvenDet.Product_ID
INNER JOIN [crm].[Inventory] Inven ON Inven.Inventory_ID = InvenDet.Inventory_ID
WHERE Inven.Customer_Id = ' + CAST(#CustomerID AS VARCHAR(10)) +
' AND ( Inven.Inventory_Date BETWEEN ' + CONVERT(VARCHAR(20), #StartDate, 121) + '
AND ' + CONVERT(VARCHAR(20), #EndDate, 121) + ' ) GROUP BY Inven.Inventory_ID, Inventory_Date,P.Product_Desc_ENG,P.Product_Weight
) y
pivot
(
sum(Product_Qty)
for Product_Desc_ENG in (' + #cols + N')
) p2 '

Related

problem in executing dynamic query using pivot with syntax error Incorrect syntax near ' + '

I want to Create a query with dynamic query and in this query i use concat some cells , when use concat like 'N'subject:' + ' ' + ContentProductionTitle' i get syntax error
error : Incorrect syntax near ' + '.
DECLARE #cols AS NVARCHAR(MAX),
#query AS NVARCHAR(MAX);
SET #cols = STUFF((SELECT distinct ',' + QUOTENAME(c.KeyWordTitle)
FROM TBL_CU_ContentProduction_KeyWord c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set #query = 'SELECT ' + #cols + ' from
(
select
isnull((select N'subject:' + ' ' + ContentProductionTitle
from Tbl_Cu_ContentProductionCalendar
where ContentProductionCalendarID = a.ActionSubjectId ),'')
+' ' +
isnull((select top 1 N'author:'+ p.FullName + ' ' from users.TblProfiles as p
where p.UserId= a.ActionUserID ),'') +' ' +
isnull((select top 1 N'edit bye:' + ' ' + p.FullName from users.TblProfiles as p
where p.UserId= a.CheckAgain ) ,'') as title
, a.ActionDateTo
, k.KeyWordTitle
from TBL_CU_ContentProduction_KeyWord as k
inner join Tbl_CU_ContentProduction as cp
on k.ContentGUID = cp.ContentGUID
inner join Tbl_Cu_ActionContentProduction as a
on a.ContentGUID = cp.ContentGUID
) x
pivot
(
max(ActionDateTo)
for KeyWordTitle in (' + #cols + ')
) p '
execute(#query)
you need to escape single quote inside your query string with '':
set #query = 'SELECT ' + #cols + ' from
(
select
isnull((select N''subject:'' + '' '' + ContentProductionTitle
from Tbl_Cu_ContentProductionCalendar
where ContentProductionCalendarID = a.ActionSubjectId ),'''')
+'' '' +
isnull((select top 1 N''author:''+ p.FullName + '' '' from users.TblProfiles as p
where p.UserId= a.ActionUserID ),'''') +'' '' +
isnull((select top 1 N''edit bye:'' + '' '' + p.FullName from users.TblProfiles as p
where p.UserId= a.CheckAgain ) ,'''') as title
, a.ActionDateTo
, k.KeyWordTitle
from TBL_CU_ContentProduction_KeyWord as k
inner join Tbl_CU_ContentProduction as cp
on k.ContentGUID = cp.ContentGUID
inner join Tbl_Cu_ActionContentProduction as a
on a.ContentGUID = cp.ContentGUID
) x
pivot
(
max(ActionDateTo)
for KeyWordTitle in (' + #cols + ')
) p '

SQL PIVOT does not recognize a table

I'm creating a pivot table but this error appears: Message 1087, level 15, state 2, line 6
Declare the table variable "#TABELLA_personale".
the #TABELLA_personale has been declared and works, so I don't understand what the problem is.
DECLARE #columns NVARCHAR(MAX), #sql NVARCHAR(MAX);
SET
#columns = N'';
SELECT
#columns += N', p.' + QUOTENAME((cast(IDUTENTE AS VARCHAR(MAX)) + ' ' + NOME + ' ' + COGNOME + ' ' + (ISNULL (LIVELLO, ''))))
FROM
(
SELECT
p.IDUTENTE,
p.NOME,
p.COGNOME,
p.LIVELLO
FROM
#TABELLA_personale AS p
INNER JOIN
#TABELLA_completa AS o
ON p.IDUTENTE = o.ID
GROUP BY
p.IDUTENTE,
P.NOME,
P.COGNOME,
P.LIVELLO
)
AS x;
SET
#sql = N'
SELECT
' + STUFF(#columns, 1, 2, '') + '
FROM
(
SELECT
p.NOME,
o.ORELAVORATE
FROM
#TABELLA_personale AS p
INNER JOIN
#TABELLA_completa AS o ONp.IDUTENTE = o.ID
)
AS j PIVOT ( MAX(ORELAVORARE) FOR NOME IN
(
'
+ STUFF(REPLACE(#columns, ', p.[', ',['), 1, 1, '') + ')) AS p;';
PRINT #sql;
EXEC sp_executesql #sql;

Adding order by for XML throws error

Here is my actual query
SELECT
aces.ProductID,'<p>' +
Replace(STUFF((SELECT DISTINCT ', ' + CAST(A.year AS VARCHAR(4)) + ' ' + A.make + ' ' + A.model + ' ' + A.enginebase_new
FROM ACES_Data A
WHERE A.ProductID = aces.ProductID
FOR XML PATH('')), 1, 1, ''), ',', '<br>')
+ '</p><p>' + i.[Subline Code] + '<br>' + i.[Subline Name] + '</p>' AS FullDescription
FROM
ACES_Data aces
LEFT OUTER JOIN
InventoryPricing i ON aces.part_number = i.PART
WHERE
aces.ProductID IS NOT NULL
AND aces.MakeModelMappingID IS NOT NULL
GROUP BY
aces.ProductID, i.[Part Description], i.[Subline Code], i.[Subline Name]
Now adding order by before XML throws an error.
Please look below updated query
SELECT
aces.ProductID,'<p>' +
Replace(
STUFF
(
(
SELECT
distinct ', ' + Cast(A.year as varchar(4)) + ' ' + A.make +' ' + A.model + ' ' + A.enginebase_new
FROM
ACES_Data A
Where
A.ProductID=aces.ProductID
order by A.make,A.year asc
FOR XML PATH('')
),1,1,'')
,',',
'<br>'
)
+ '</p><p>' + i.[Subline Code] + '<br>'+ i.[Subline Name] + '</p>' As FullDescription
from ACES_Data aces
Left outer join InventoryPricing i
on aces.part_number = i.PART
where aces.ProductID is not null
and aces.MakeModelMappingID is not null
Group By aces.ProductID,i.[Part Description],i.[Subline Code],i.[Subline Name]
on inserting
Where A.ProductID=aces.ProductID **order by A.make,A.year asc** FOR XML PATH('')
it gives me error as
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Since enginebase_new & model is not part of Order by you cannot use DISTINCT in Select.
Use Group by instead of DISTINCT to remove duplicates
SELECT ', ' + Cast(A.year AS VARCHAR(4)) + ' ' + A.make
+ ' ' + A.model + ' ' + A.enginebase_new
FROM ACES_Data A
WHERE A.ProductID = aces.ProductID
GROUP BY A.year,
A.make,
A.model,
A.enginebase_new
ORDER BY A.make,
A.year ASC
FOR XML PATH('')

SQL Server 2012 ORDER BY works differently?

I have used the following code in SQL Server 2005 for years and recently upgraded to SQL Server 2012 and it has seemingly broken the ORDER BY clause. The code is supposed to display like so:
A
A1
B
B1
B2
B3
C
But is grouping all the lines of the same type together. Any ideas why?
DECLARE #PeriodStart DATETIME
DECLARE #PeriodEnd DATETIME
SELECT #PeriodEnd = Getdate(),
#PeriodStart = Dateadd(hour, -96, Getdate());
WITH outpq
AS (SELECT 1 AS grpOrd,
Cast(NULL AS VARCHAR(255)) AS posInGrp,
'A' AS Ord,
casenumberkey,
'A|' + clientskey + '|'
+ Cast(brtnumber AS VARCHAR(11)) + '|'
+ Isnull(Replace(CONVERT(CHAR(10), coverdate, 101), '/', ''), ''
)
+ '|'
+ Isnull(Replace(CONVERT(CHAR(10), coverdate, 101), '/', ''), ''
)
+ '|' + Isnull(parcelnumber, '') + '|'
+ Isnull(assessedbeg, '') + '|'
+ Isnull(assesseddim, '') + '|'
+ Isnull(abbrlegal, '') + '|'
+ Isnull(waterfrom, '') + '|'
+ Isnull(waterto, '') + '|'
+ Isnull(Cast(wateropen AS VARCHAR(50)), '')
+ '|' + Isnull(taxfrom, '') + '|' + Isnull(taxto, '')
+ '|'
+ Isnull(Cast(taxopen AS VARCHAR(50)), '') AS Extract
FROM newcitycollection.dbo.propertyinformation
WHERE datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 1 AS grpOrd,
NULL AS posInGrp,
'A1',
A.casenumberkey,
'A1|' + '|' + '|' + B.liennumber + '|'
+ Isnull(Cast(B.lienamt AS VARCHAR(50)), '')
+ '|' + Isnull(Replace(liendate, '/', ''), '')
+ '|' + Isnull(B.lienreason, '') AS Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN newcitycollection.dbo.muniliens B
ON B.casenumberkey = A.casenumberkey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 2 AS grpOrd,
Cast(C.interestskey AS VARCHAR(11)) AS posInGrp,
'B',
A.casenumberkey,
'B|' + '|' + Isnull(C.first, '') + '|'
+ Isnull(C.middle, '') + '|' + Isnull(C.last, '')
+ '|' + Isnull(C.alias, '') + '|'
+ Isnull(C.comname, '') + '|'
+ Isnull(C.docrel, '') + '|'
+ Cast(C.interestskey AS VARCHAR(11)) AS Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN newcitycollection.dbo.interests C
ON C.casenumberkey = A.casenumberkey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 2 AS grpOrd,
Cast(C.interestskey AS VARCHAR(11)) AS posInGrp,
'B1',
A.casenumberkey,
'B1|' + Isnull(fulladd, '') + '|'
+ Isnull(D.city, '') + '|' + Isnull(D.state, '')
+ '|' + Isnull(D.zip, '') AS Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN newcitycollection.dbo.interests C
ON C.casenumberkey = A.casenumberkey
JOIN newcitycollection.dbo.interestadd D
ON D.casenumberkey = A.casenumberkey
AND D.interestskey = C.interestskey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 2 AS grpOrd,
Cast(C.interestskey AS VARCHAR(11)) AS posInGrp,
'B2',
A.casenumberkey,
'B2|' + '|' + Isnull(E.suitnumber, '') + '|'
+ Cast(E.bdate AS VARCHAR(11)) + '|'
+ Isnull(E.chapter, '') + '|' + Isnull(E.vs, '') AS Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN newcitycollection.dbo.interests C
ON C.casenumberkey = A.casenumberkey
JOIN newcitycollection.dbo.banks E
ON E.casenumberkey = A.casenumberkey
AND E.interestskey = C.interestskey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 3 AS grpOrd3,
NULL AS posInGrp,
'B3',
A.casenumberkey,
'B3|' + '|' + F.doctype + '|'
+ Isnull(Cast(F.docamt AS VARCHAR(50)), '')
+ '|'
+ Isnull(Replace(CONVERT(CHAR(10), docdate, 101), '/', ''), '')
+ '|'
+ Isnull(Replace(CONVERT(CHAR(10), recdate, 101), '/', ''), '')
+ '|' + Isnull(F.docid, '') + '|'
+ Isnull(F.grantee, '') + '|'
+ Isnull(F.grantor, '')
+ Cast(F.docidkey AS VARCHAR(11)) AS Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN newcitycollection.dbo.documents F
ON F.casenumberkey = A.casenumberkey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
UNION ALL
SELECT 4
AS grpOrd
,
NULL
AS posInGrp,
'C',
A.casenumberkey,
'C|' + Isnull(J.ctype, '') + '|'
+ Isnull(J.plaintiffname, '') + '|'
+ Isnull(J.plaintiffadd1, '') + '|'
+ Isnull(J.plaintiffcity, '') + '|'
+ Isnull(J.plaintiffstate, '') + '|'
+ Isnull(J.plaintiffzip, '') + '|' + '|'
+ Isnull(J.defendantname, '') + '|'
+ Isnull(J.defendantadd1, '') + '|'
+ Isnull(J.defcity, '') + '|'
+ Isnull(J.defstate, '') + '|'
+ Isnull(J.defzip, '') + '|' + '|'
+ Isnull(J.court, '') + '|' + Isnull(J.caseid, '')
+ '|' + Isnull(J.jamt, '') + '|'
+ Isnull(Replace(CONVERT(VARCHAR(10), jdate, 101), '/', ''), '')
+ '|'
+ Isnull(Replace(CONVERT(VARCHAR(10), reviveddate, 101), '/', ''
), ''
)
AS
Extract
FROM newcitycollection.dbo.propertyinformation A
JOIN acme.new_judgment_system.dbo.selected_compiled_clean J
ON J.casenumber = A.casenumberkey
WHERE A.datefinished BETWEEN #PeriodStart AND #PeriodEnd
AND clientkey = 2
AND J.plaintiffname NOT IN (SELECT plaintiff
FROM
newcitycollection.dbo.excluded_plaintiffs))
--Extract data set into a table -- dump table in .txt with current date as part of name then delete that table
SELECT extract
INTO datadump
FROM outpq
ORDER BY casenumberkey,
grpord,
posingrp,
ord
DECLARE #FileName VARCHAR(50),
#bcpCommand VARCHAR(2000)
SET #FileName = Replace('D:\LDExport\Argosy_import_'
+ CONVERT(CHAR(8), Getdate(), 1) + '_0001.txt', '/', '')
SET #bcpCommand = 'bcp "SELECT Extract FROM datadump" QUERYOUT "'
SET #bcpCommand = #bcpCommand + #FileName
+ '" -U sa -P $%^&*() -T -c'
EXEC master..Xp_cmdshell
#bcpCommand
DROP TABLE datadump
Your final query...
SELECT Extract FROM datadump
...doesn't have an ORDER BY. What do you expect?
Add an ORDER BY there. What you ordered by when you inserted has no bearing on future queries.

dynamic sql query with FOR XML Path

I have following sql and when i run this its throw error
Incorrect syntax near '1'.
declare #sql nvarchar(max)
set #sql =N'SELECT PT.P_Name as Prisoner_Type,
PE.PID_No,PE.Jail_Code,PE.Entry_Year,Convert(varchar(10),PE.Admission_Date,103) Admission_Date,PE.JID_No,Convert(varchar(10),PE.Release_Date,103) Release_Date ,
PM.Prisoner_Name, SUBSTRING(PM.Father_Name, 0, 17)as Father_Name, PM.Mother_Name,PM.Spouse_Name,PM.Caste_Code,
PM.Religion_Code,PM.Occupation_Code,PM.Qualification,PM.Tendency_Type,PM.Risk_Type,PM.Annual_Income_Code,PM.Marital_Status_Code,PM.Id_Mark,
PM.Sex_Code,PM.Nationality_Code,PM.Off_Code,PM.Present_Add, Age as age ,PM.Permt_Add, LS.Location AS Location
,NT.Nation_Name , JT.Jail_Address
,OT.Offence_Name,QT.Qualification as quali ,IT.Annual_Income_Range,CT.Caste_Name
,RT.Religion_Name,MT.Marital_Status_Name,OFT.Occ_Name AS Occupation
, STUFF(( SELECT '', '' + cc.Act_Sec AS [text()]
FROM CourtCases cc
WHERE
cc.PID_NO = PE.PID_NO and ('','' + Replace(pe.Case_No,''$'','','') +'','' LIKE ''%,'' + CONVERT(VARCHAR, cc.Case_No) + '',%'') group by cc.Act_Sec
FOR XML PATH('''') ),'+ cast(1 as nvarchar(10))+', '+cast(1 as nvarchar(10))+', '''' )
AS [Act_Sec]
, STUFF(( SELECT '', '' + Convert(varchar(10),CC.Fir_Date,103) AS [text()]
FROM CourtCases cc
WHERE
cc.PID_NO = PE.PID_NO and ('','' + Replace(pe.Case_No,''$'','','') +'','' LIKE ''%,'' + CONVERT(VARCHAR, cc.Case_No) + '',%'') group by Convert(varchar(10),CC.Fir_Date,103)
FOR XML PATH('''') ),'+ cast(1 as nvarchar(10))+', '+cast(1 as nvarchar(10))+', '''' )
AS [Fir_Date]
,STUFF(( SELECT '', '' + FIR_No AS [text()]
FROM CourtCases cc
WHERE
cc.PID_NO = PE.PID_NO and ('','' + Replace(pe.Case_No,''$'','','') +'','' LIKE ''%,'' + CONVERT(VARCHAR, cc.Case_No) + '',%'') group by FIR_No
FOR XML PATH('''') ),'+ cast(1 as nvarchar(10))+', '+cast(1 as nvarchar(10))+', '''' )
AS [FIR_No]
, STUFF(( SELECT '', '' + ct.Court_Name AS [text()]
FROM CourtCases cc inner join Court_Tab as ct
ON cc.Court_Code=convert(nvarchar(50),ct.Court_Code)
WHERE
cc.PID_NO = PE.PID_NO and ('','' + Replace(pe.Case_No,''$'','','') +'','' LIKE ''%,'' + CONVERT(VARCHAR, cc.Case_No) + '',%'') group by ct.Court_Name
FOR XML PATH('''') ),'+ cast(1 as nvarchar(10))+', '+cast(1 as nvarchar(10))+', '''' )
AS [Court_Name]
, STUFF(( SELECT '', '' + pt.PS_Name AS [text()]
FROM CourtCases cc inner join PS_Tab as pt
ON convert(nvarchar(50),cc.PS_Code)=convert(nvarchar(50),pt.PS_Code)
WHERE
cc.PID_NO = PE.PID_NO and ('','' + Replace(pe.Case_No,''$'','','') +'','' LIKE ''%,'' + CONVERT(VARCHAR, cc.Case_No) + '',%'') group by pt.PS_Name
FOR XML PATH('''') ),'+ cast(1 as nvarchar(10))+', '+cast(1 as nvarchar(10))+', '''' )
AS [PS_Name]
FROM PrisonMaster AS PM
INNER JOIN PrisonerEntry AS PE ON PE.PID_No = PM.PID_No AND PE.Jail_Code='+cast(#JailCode as nvarchar) +
'INNER JOIN Nation_Tab AS NT ON PM.Nationality_Code = NT.Nation_Code
INNER JOIN Sex_Tab AS S ON PM.Sex_Code = S.Sex_Code
INNER JOIN Jail_Tab AS JT ON PE.Jail_Code = JT.Jail_Code
INNER JOIN Prisoner_Tab AS PT ON PE.Prisoner_Type=PT.P_Type
INNER JOIN Loc_Status AS LS ON PE.Location=LS.Loc_Status
left JOIN Offence_Tab AS OT ON OT.Offence_Code=PM.Occupation_Code
left JOIN Qualification_Tab AS QT ON QT.Q_Code=PM.Qualification
left JOIN Income_Tab AS IT ON IT.Annual_Income_Code=PM.Annual_Income_Code
left JOIN Caste_Tab AS CT ON CT.Caste_Code=PM.Caste_Code
LEFT JOIN Religion_Tab AS RT ON RT.Religion_Code=PM.Religion_Code
LEFT JOIN Marital_Tab AS MT ON MT.Marital_Status_Code=PM.Marital_Status_Code
LEFT JOIN Occupation_Tab AS OFT ON OFT.Occ_Code=PM.Occupation_Code
WHERE
PE.Admission_Date BETWEEN '+cast(#DATE1 as nvarchar(50))+' and '+ cast(#DATE2 as nvarchar(50))
exec (#sql)
What the ... is this + cast(1 as nvarchar(10))+ ?
Just do + '1' + or even better just add the 1 into your string.