Why EXEC sp_sqlexec #strSQL with EXECUTE (PRINT #strSQL) is different - sql

I have this query:
CREATE PROCEDURE [dbo].[TraCuuBoTieuChi_Head]
#ChuoiLoai nvarchar(20),
#ChuoiXa nvarchar(MAX),
#ThangNam datetime
AS
DECLARE #strSQL nvarchar(MAX)
DECLARE #Str NVARCHAR(MAX)
DECLARE #Str2 NVARCHAR(MAX)
DECLARE #Str3 NVARCHAR(MAX)
DECLARE #Str4 NVARCHAR(MAX)
DECLARE #Str5 NVARCHAR(MAX)
DECLARE #Str6 NVARCHAR(MAX)
SET #Str = STUFF((SELECT ',' + (CASE WHEN items = 1 THEN 'SL_CuThe_Loai1 nvarchar(50)' WHEN items = 2 THEN 'SL_CuThe_Loai2 nvarchar(50)' ELSE 'SL_CuThe_Loai3 nvarchar(50)' END) FROM dbo.Split(#ChuoiLoai, ',') FOR XML PATH('')), 1, 1, '')
SET #Str2 = STUFF((SELECT ',' + (CASE WHEN items = 1 THEN 'SL_CuThe_Loai1' WHEN items = 2 THEN 'SL_CuThe_Loai2' ELSE 'SL_CuThe_Loai3' END) FROM dbo.Split(#ChuoiLoai, ',') FOR XML PATH('')), 1, 1, '')
SET #Str3 = STUFF((SELECT ',' + (CASE WHEN items = 1 THEN N'N''Giá trị mẫu 1''' WHEN items = 2 THEN N'N''Giá trị mẫu 2''' ELSE N'N''Giá trị mẫu 3''' END) FROM dbo.Split(#ChuoiLoai, ',') FOR XML PATH('')), 1, 1, '')
PRINT #Str3
SET #Str4 = STUFF((SELECT ',' + ('Xa' + items + ' nvarchar(100)') FROM dbo.Split(#ChuoiXa, ',') FOR XML PATH('')), 1, 1, '')
SET #Str5 = STUFF((SELECT ',' + ('Xa' + items ) FROM dbo.Split(#ChuoiXa, ',') FOR XML PATH('')), 1, 1, '')
SET #Str6 = STUFF((SELECT ',' + ((SELECT 'N''' + LocationName + '''' FROM Location WHERE LocationID = items)) FROM dbo.Split(#ChuoiXa, ',') FOR XML PATH('')), 1, 1, '')
PRINT #Str6
SET #strSQL = 'CREATE TABLE #tmp_paging_index (BulletCode nvarchar(30),TenTieuChi nvarchar(50),' + #Str + ',' + #Str4 + ')
INSERT INTO #tmp_paging_index (BulletCode,TenTieuChi,' + #Str2 + ',' + #Str5 + ')
SELECT N''BulletCode'',N''Tên tiêu chí'',' + #Str3 + ',' + #Str6 + '
SELECT * FROM #tmp_paging_index
DROP TABLE #tmp_paging_index'
PRINT #strSQL
EXEC sp_sqlexec #strSQL
When I run the procedure it outputs the following:
The Print section produces the following output:
*PRINT 1 : N'Giá trị mẫu 1',N'Giá trị mẫu 2',N'Giá trị mẫu 3'
PRINT 2: N'Xã Phú Hải',N'Xã Quảng Trung ',N'Xã Quảng Phong '
PRINT 3: CREATE TABLE #tmp_paging_index (BulletCode nvarchar(30),TenTieuChi nvarchar(MAX),SL_CuThe_Loai1 nvarchar(50),SL_CuThe_Loai2 nvarchar(50),SL_CuThe_Loai3 nvarchar(50),Xa14 nvarchar(100),Xa15 nvarchar(100),Xa16 nvarchar(100))
INSERT INTO #tmp_paging_index (BulletCode,TenTieuChi,SL_CuThe_Loai1,SL_CuThe_Loai2,SL_CuThe_Loai3,Xa14,Xa15,Xa16)
SELECT N'BulletCode',N'Tên tiêu chí',N'Giá trị mẫu 1',N'Giá trị mẫu 2',N'Giá trị mẫu 3',N'Xã Phú Hải',N'Xã Quảng Trung ',N'Xã Quảng Phong '
SELECT * FROM #tmp_paging_index
DROP TABLE #tmp_paging_index*
I run the print version and it came out different:
Now I have to do the same thing as running the print.

sp_sqlexec is from much earlier days. Not sure it is still supported on later version of SQL Server. You should use sp_executesql.
I found this thread on MSDN that mention sp_sqlexec does not support unicode. Probably that explain why you get different output
https://social.msdn.microsoft.com/Forums/sqlserver/en-US/554d6373-8a22-4b10-8744-df13e5415f84/spexecutesql-vs-spsqlexec?forum=sqlgetstarted

Related

Conversion failing when applying PIVOTED SCRIPT

i am having a data conversion issues when applying this un-pivoted script on my dynamic columns SSRS report .every time SSRS Report is executed the header columns are supposedly to change .
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL
DROP TABLE ##Temp;
DECLARE #ObjectName VARCHAR(100) = '[AdventureWorks2016].[Sales].[SalesOrderHeader]' ,
#KeyColumn VARCHAR(100) = '[SalesOrderID]';
DECLARE #ColumnNames NVARCHAR(MAX)= '' ,
#Values NVARCHAR(MAX)= '' ,
#SQL NVARCHAR(MAX)= '';
SELECT #ColumnNames += ',
' + QUOTENAME([ShipDate]) ,
#Values += ',
' + QUOTENAME([ShipDate]) + ' = CONVERT(VARCHAR(100), '
+ QUOTENAME([ShipDate]) + ')'
FROM [AdventureWorks2016].[Sales].[SalesOrderHeader]
WHERE '[Sales].[SalesOrderHeader]' = #ObjectName
AND [ShipDate] <> #KeyColumn;
SET #SQL = N'Select * into ##Temp
FROM
(
SELECT ' + #KeyColumn + #Values + '
FROM ' + #ObjectName + '
) AS DRV
UNPIVOT
(
Value FOR ColumnName IN (' + STUFF(#ColumnNames, 1, 1, '') + ')
) AS UnPVT;';
EXEC sp_executesql #SQL;
SELECT *
FROM ##Temp

String literal in SQL query field

I'd like to do a stuff command in string literal query and it give some error
The query without string literal working:
SELECT apGr.*, 'Name: ' + apGr.GroupDesc + ' | Group: ' + apGr.GroupName GroupFull ,
abc = STUFF
(
(
SELECT ',' + appGrMn.Email
FROM APP_GroupManager As appGrMn
-- You only want to combine rows for a single ID here:
WHERE appGrMn.GroupId = apGr.GroupId
FOR XML PATH (''), TYPE
).value('.', 'varchar(max)')
, 1, 1, '')
FROM App_Group apGr
WHERE apGr.GroupId = 239
The query as string literal failed:
DECLARE #WhereQuery NVARCHAR(200) = ''
DECLARE #Query NVARCHAR(500)
SET #GroupId = 5
-- Insert statements for procedure here
IF(#GroupId IS NOT NULL)
BEGIN
PRINT(#GroupId)
SET #WhereQuery = 'WHERE apGr.GroupId = ' + #GroupId
END
ELSE IF (#SystemId IS NOT NULL)
BEGIN
SET #WhereQuery = 'WHERE apGr.SystemId = ' + #SystemId
END
ELSE IF (#GroupName IS NOT NULL)
BEGIN
SET #WhereQuery = 'WHERE apGr.GroupName = ''' + #GroupName + ''''
END
SET #Query = 'SELECT ''Name: '' + apGr.GroupDesc + '' | Group: '' + apGr.GroupName GroupFull ,
abc = STUFF
(
(
SELECT '','' + appGrMn.AdministratorMail
FROM APP_GroupManager As appGrMn
-- You only want to combine rows for a single ID here:
WHERE appGrMn.GroupId = apGr.GroupId
FOR XML PATH (''), TYPE
).value(''.'', varchar(max))
, 1, 1, '') ' +
'FROM App_Group apGr ' +
'JOIN T_SensitiveLevel AS tSen ON tSen.SensitiveLevelId = apGr.SensitiveLevelId ' + #WhereQuery
PRINT #Query
EXEC(#Query)
END
The printed query looks:
5
SELECT 'Name: ' + apGr.GroupDesc + ' | Group: ' + apGr.GroupName GroupFull ,
abc = STUFF
(
(
SELECT ',' + appGrMn.AdministratorMail
FROM APP_GroupManager As appGrMn
-- You only want to combine rows for a single ID here:
WHERE appGrMn.GroupId = apGr.GroupId
FOR XML PATH ('), TYPE
).value('.', varchar(max))
, 1, 1, ') FROM App_Group apGr JOIN T_SensitiveLevel AS tSen ON tSen.SensitiveLevelId = apGr.SensitiveLevelId WHERE apGr.GroupId = 2
It not append the #WhereQuery as it should and the error is:
Msg 102, Level 15, State 1, Line 20
Incorrect syntax near '.'.
Any help on this would be appreciated.
There were some '' related syntax error. instead of '' you need to use '''' when expecting ('') in output. Where clause is truncated since #query became larger then it's length(500). I have made some changes in the query please check:
DECLARE #WhereQuery NVARCHAR(200) = ''
DECLARE #Query NVARCHAR(2000)
declare #GroupId NVARCHAR(500)
declare #SystemId NVARCHAR(500)
declare #GroupName NVARCHAR(500)
set #GroupName='a'
SET #GroupId = 5
-- Insert statements for procedure here
IF(#GroupId IS NOT NULL)
BEGIN
PRINT(#GroupId)
SET #WhereQuery = 'WHERE apGr.GroupId = ' + #GroupId
END
ELSE IF (#SystemId IS NOT NULL)
BEGIN
SET #WhereQuery = 'WHERE apGr.SystemId = ' + #SystemId
END
ELSE IF (#GroupName IS NOT NULL)
BEGIN
SET #WhereQuery = 'WHERE apGr.GroupName = ''' + #GroupName + ''''
END
SET #Query = 'SELECT ''Name: '' + apGr.GroupDesc + '' | Group: '' + apGr.GroupName GroupFull ,
abc = STUFF
(
(
SELECT '','' + appGrMn.AdministratorMail
FROM APP_GroupManager As appGrMn
-- You only want to combine rows for a single ID here:
WHERE appGrMn.GroupId = apGr.GroupId
FOR XML PATH (''''), TYPE
).value(''.'', ''varchar(max)'')
, 1, 1, '''') ' +
'FROM App_Group apGr ' +
'JOIN T_SensitiveLevel AS tSen ON tSen.SensitiveLevelId = apGr.SensitiveLevelId ' + #WhereQuery +''
PRINT #Query
EXEC(#Query)

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;

Cannot convert utf-8 in Stored Procedure SQL

I'm stuck in the utf-8 format. I used CAST or CONVERT USING UTF-8. Even I set character N in front of query string but it's still not working.
My stored procedure:
ALTER PROCEDURE [dbo].[SPC_SP_HSDXTChinh_BangSo4_Fake]
#idDuAn NUMERIC(18, 0),
#idGoiThau NUMERIC(18, 0),
#idDonVi INT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
DECLARE #resultString NVARCHAR(MAX);
DECLARE #queryString NVARCHAR(MAX);
DECLARE #Str_TinhHopLe NVARCHAR(255), #Str_DanhGia NVARCHAR(255), #Str_XepHang NVARCHAR(255);
SET #Str_TinhHopLe = 'N''Kết quả đánh giá tính hợp lệ của HSĐXTC''';
SET #Str_DanhGia = 'N''Giá đánh giá''';
SET #Str_XepHang = 'N''Xếp hạng các HSDT''';
SELECT #resultString = COALESCE(#resultString + ',', '') + RES.TenNhaThau
FROM (
SELECT '[' + TenNhaThau + ']' AS TenNhaThau
FROM [SPC_fn_HSDXTChinh_NhaThau_CoTinhHopLe] (#idDuAn, #idGoiThau, #idDonVi)
) RES
--PRINT #resultString
PRINT #Str_TinhHopLe;
SET #queryString = '
SELECT *
FROM (
SELECT 1 AS STT,' + #Str_TinhHopLe + ' AS NoiDung,
CAST(RES.TenNhaThau AS NVARCHAR(255)) AS TenNhaThau,
CAST(RES.KetQuaDanhGia AS VARCHAR(25)) AS KetQuaDanhGia
FROM [SPC_fn_HSDXKThuat_BangSo4] (' + CAST(#idDuAn AS VARCHAR(20)) + ',' + CAST(#idGoiThau AS VARCHAR(20)) + ',' + CAST(#idDonVi AS VARCHAR(10)) + ') RES
) SRC
PIVOT(MAX(KetQuaDanhGia) FOR TenNhaThau IN (' + #resultString + ')) P
UNION ALL
SELECT *
FROM (
SELECT 2 AS STT
,' + #Str_DanhGia + ' AS NoiDung,
CAST(RES.TenNhaThau AS NVARCHAR(255)) AS TenNhaThau,
CAST(RES.GiaTri AS VARCHAR(25)) AS GiaTri
FROM [SPC_fn_HSDXKThuat_BangSo4] (' + CAST(#idDuAn AS VARCHAR(20)) + ',' + CAST(#idGoiThau AS VARCHAR(20)) + ',' + CAST(#idDonVi AS VARCHAR(10)) + ') RES
) SRC2
PIVOT(MAX(GiaTri) FOR TenNhaThau IN (' + #resultString + ')) P
UNION ALL
SELECT *
FROM (
SELECT 3 AS STT
,' + #Str_XepHang + ' AS NoiDung,
CAST(RES.TenNhaThau AS NVARCHAR(255)) AS TenNhaThau,
CAST(ROW_NUMBER() OVER(ORDER BY GiaTri) AS VARCHAR(25)) AS XepHang
FROM [SPC_fn_HSDXKThuat_BangSo4] (' + CAST(#idDuAn AS VARCHAR(20)) + ',' + CAST(#idGoiThau AS VARCHAR(20)) + ',' + CAST(#idDonVi AS VARCHAR(10)) + ') RES
) SRC2
PIVOT(MAX(XepHang) FOR TenNhaThau IN (' + #resultString + ')) P
';
PRINT #queryString;
EXEC (#queryString);
END
A part of output messages after run stored:
SELECT
1 AS STT,
N'K?t qu? dánh giá tính h?p l? c?a HSÐXTC' AS NoiDung,
CAST(RES.TenNhaThau AS NVARCHAR(255)) AS TenNhaThau,
CAST(RES.KetQuaDanhGia AS VARCHAR(25)) AS KetQuaDanhGia
FROM
[SPC_fn_HSDXKThuat_BangSo4] (60006000000000166, 60006000000000347, 60006) RES
You can see error text: N'K?t qu? dánh giá tính h?p l? c?a HSÐXTC'.
I want to output: Kết quả đánh giá tính hợp lệ của HSĐXTC
How can I fix this?
Change these lines in your procedure:
SET #Str_TinhHopLe = N'Kết quả đánh giá tính hợp lệ của HSĐXTC';
SET #Str_DanhGia = N'Giá đánh giá';
SET #Str_XepHang = N''Xếp hạng các HSDT';

why such so many single quote used in query

I am searching a query which generate html table. I found this query, but I can not understand what is use of such so many single quote used here and
why all code create in variable. I am new in sql please help me.
BEGIN
SET NOCOUNT ON;
IF #orderBy IS NULL
BEGIN
SET #orderBy = ''
END
SET #orderBy = REPLACE(#orderBy, '''', '''''');
DECLARE #realQuery NVARCHAR(MAX) = ' //this is variable which take all query as string
DECLARE #headerRow nvarchar(MAX);
DECLARE #cols nvarchar(MAX);
SELECT * INTO #dynSql FROM (' + #query + ') sub; -- how this temp table create
SELECT #cols = COALESCE(#cols + '', '''''''', '', '''') + ''['' + name + ''] AS ''''td''''''
FROM tempdb.sys.columns
WHERE object_id = object_id(''tempdb..#dynSql'')
ORDER BY column_id;
SET #cols = ''SET #html = CAST(( SELECT '' + #cols + '' FROM #dynSql ' + #orderBy + ' FOR XML PATH(''''tr''''), ELEMENTS XSINIL) AS nvarchar(max))''
EXEC sys.sp_executesql #cols, N''#html nvarchar(MAX) OUTPUT'', #html=#html OUTPUT
--in coalesce why so many '''' used
SELECT #headerRow = COALESCE(#headerRow + '''', '''') + ''<th>'' + name + ''</th>''
FROM tempdb.sys.columns
WHERE object_id = object_id(''tempdb..#dynSql'')
ORDER BY column_id;
SET #headerRow = ''<tr>'' + #headerRow + ''</tr>'';
SET #html = ''<table border="1">'' + #headerRow + #html + ''</table>'';
';
EXEC sys.sp_executesql #realQuery
,N'#html nvarchar(MAX) OUTPUT'
,#html = #html OUTPUT
END
Above query is working fine, but I can't understand it.