I am writing a dynamic SQL statement that is failing with the error
Must declare the scalar variable "##config"
I have tried to break the code down and can confirm that the following code does return results:
Declare ##sql as nvarchar(max);
Declare #SourceDatabase as nvarchar(10);
Declare #DestDatabase as nvarchar(10);
Declare ##Harray as nvarchar(max) ;
Set #SourceDatabase = 'D_EXP_CPM';
Set #DestDatabase = 'T_EXP_CPM';
set ##sql = 'SELECT B.Hierarchy_SKey AS ''NEW'', A.Hierarchy_SKey AS ''OLD''
INTO ##TEMPHCONVERT
FROM ' + #SourceDatabase + '.[dbo].[DIM_HIERARCHY] A
INNER JOIN ' + #DestDatabase + '.[dbo].[DIM_HIERARCHY] B
ON A.Hierarchy_Desc = B.Hierarchy_Desc
WHERE A.Hierarchy_SKey in (' + ##Harray + ');'
exec (##sql);
Declare ##config as NVARCHAR(MAX);
SELECT ##config = COALESCE(##config + ', H' + cast(A.[NEW] as nvarchar), 'H' + cast(A.[NEW] as nvarchar))
FROM ##TEMPHCONVERT A;
Print ##config
Which returns the value: "H15, H16, H17, H18"
When this is plugged into the dynamic SQL statement though I get the error...
Declare #SourceDatabase as nvarchar(10)
Declare #DestDatabase as nvarchar(10)
Declare ##sql as nvarchar(max) --variable to hold sql statements for this stored proc
Declare ##Harray as nvarchar(max) -- variable to hold hierarchy array elements from source
Set #SourceDatabase = 'D_EXP_CPM';
Set #DestDatabase = 'T_EXP_CPM';
Declare ##config as NVARCHAR(MAX);
set ##sql =
'SELECT
B.Hierarchy_SKey AS ''NEW'', A.Hierarchy_SKey AS ''OLD''
INTO ##TEMPHCONVERT
FROM ' + #SourceDatabase + '.[dbo].[DIM_HIERARCHY] A
INNER JOIN ' + #DestDatabase + '.[dbo].[DIM_HIERARCHY] B
ON A.Hierarchy_Desc = B.Hierarchy_Desc
WHERE A.Hierarchy_SKey in (' + ##Harray + ');'
exec (##sql);
set ##sql = '
UPDATE A SET A.[Value_Text] = (SELECT ##config = COALESCE(##config + '', H'' + cast(A.[NEW] as nvarchar), ''H'' + cast(A.[NEW] as nvarchar))
FROM ##TEMPHCONVERT A)
FROM ' + #DestDatabase + '.[dbo].[DIM_CONFIG] A ON A.[Config_Desc] = ''JBCODE FTE Map Hierarchy List'' ;'
exec (##sql);
Note I've cut quite a bit of code out of the middle here to make the post as short as possible. Can anybody explain why I'm getting the error?
I've tried declaring the variable inside the dynamic SQL statement in two places but neither allowed the code to run. I'm thinking maybe the variable needs passing somehow but I'm not sure how to do that through to the sub query.
Put the ##config Declaration in the ##sql string:
Declare #SourceDatabase as nvarchar(10)
Declare #DestDatabase as nvarchar(10)
Declare ##sql as nvarchar(max) --variable to hold sql statements for this stored proc
Declare ##Harray as nvarchar(max) -- variable to hold hierarchy array elements from source
Set #SourceDatabase = 'D_EXP_CPM';
Set #DestDatabase = 'T_EXP_CPM';
set ##sql =
'SELECT
B.Hierarchy_SKey AS ''NEW'', A.Hierarchy_SKey AS ''OLD''
INTO ##TEMPHCONVERT
FROM ' + #SourceDatabase + '.[dbo].[DIM_HIERARCHY] A
INNER JOIN ' + #DestDatabase + '.[dbo].[DIM_HIERARCHY] B
ON A.Hierarchy_Desc = B.Hierarchy_Desc
WHERE A.Hierarchy_SKey in (' + ##Harray + ');'
exec (##sql);
set ##sql = 'Declare ##config as NVARCHAR(MAX)
UPDATE A SET A.[Value_Text] = (SELECT COALESCE(##config + '', H'' + cast(A.[NEW] as nvarchar), ''H'' + cast(A.[NEW] as nvarchar))
FROM ##TEMPHCONVERT A)
FROM ' + #DestDatabase + '.[dbo].[DIM_CONFIG] A ON A.[Config_Desc] = ''JBCODE FTE Map Hierarchy List'' ;'
exec (##sql);
I'm not sure why you are getting the error, but this is a slight rewrite from what you have. Rather than concatenating a long string, I like to declare a template and then replace the parameters before executing. It just makes it more readable to me. I moved all of the related code into ##sql and just return the results in a temp table.
Declare ##sql as nvarchar(max);
Declare #SourceDatabase as nvarchar(10);
Declare #DestDatabase as nvarchar(10);
Declare ##Harray as nvarchar(max) ;
Set #SourceDatabase = 'D_EXP_CPM';
Set #DestDatabase = 'T_EXP_CPM';
set ##Harray = '1,2,3';
set ##sql = '
SELECT B.Hierarchy_SKey AS ''NEW'', A.Hierarchy_SKey AS ''OLD''
INTO #TEMPHCONVERT
FROM [[source]].[dbo].[DIM_HIERARCHY] A
INNER JOIN [[dest]].[dbo].[DIM_HIERARCHY] B
ON A.Hierarchy_Desc = B.Hierarchy_Desc
WHERE A.Hierarchy_SKey in ([Harray]);
Declare ##config as NVARCHAR(MAX);
SELECT ##config = COALESCE(##config + '', H'' + cast(A.[NEW] as nvarchar), ''H'' + cast(A.[NEW] as nvarchar))
FROM #TEMPHCONVERT A;
select [config] = ##config into ##config
'
set ##sql = replace(##sql, '[source]', #SourceDatabase)
set ##sql = replace(##sql, '[dest]', #DestDatabase)
set ##sql = replace(##sql, '[Harray]', ##Harray)
exec (##sql);
select * from ##config
drop table ##config
Declare #config as NVARCHAR(MAX);
SELECT #config = COALESCE(#config + ', H' + cast(A.[NEW] as nvarchar), 'H' + cast(A.[NEW] as nvarchar))
FROM #TEMPHCONVERT A;
set #sql = 'UPDATE A SET A.[Value_Text] = (#config )
FROM ' + #DestDatabase + '.[dbo].[DIM_CONFIG] A WHERE A.[Config_Desc] = ''JBCODE FTE Map Hierarchy List'' ;'
PRINT 'STEP 15 COMPLETE';
Related
I am trying to create the below dynamic update query with some variables and for some reason, it's not working inside the stored procedure. Can someone suggest to me where I am doing wrong and what's the best practice by avoiding the SQL Injection as well?
DECLARE #SQL NVARCHAR(MAX)
DECLARE #COLUMN1 NVARCHAR(10)
DECLARE #COLUMN2 NVARCHAR(10)
DECLARE #TABLENAME NVARCHAR(10)
SET #SQL = 'UPDATE TL
SET '+ #COLUMN1 + '= AB.COLUMN1,'
+ #COLUMN2 + '= AB.COLUMN2
FROM' + #TABLENAME + ' TL
JOIN ABACUS AB
ON TL.REF = AB.REF
AND TL.SUBS = AB.SUBS
WHERE ' + #COLUMN1 + ' IS NULL
AND ' + #COLUMN2 +' IS NULL';
SET #COLUMN1 = (SELECT CONCAT('USER_ID', '8'))
SET #COLUMN2 = (SELECT CONCAT('USER_ID', '6'))
SET #TABLENAME = 'POLICYREF';
EXEC sys.sp_executesql #SQL, #TABLENAME, #COLUMN1, #COLUMN2;
SET #TABLENAME = 'USERREF';
EXEC sys.sp_executesql #SQL, #TABLENAME, #COLUMN1, #COLUMN2;
You need dynamic SQL, not parameters. You can't parameterize column names or table names. So something like:
DECLARE #SQL NVARCHAR(MAX)
DECLARE #COLUMN1 NVARCHAR(10) = 'USER_ID8'
DECLARE #COLUMN2 NVARCHAR(10) = 'USER_ID6'
DECLARE #TABLENAME NVARCHAR(10) = 'POLICYREF'
SET #SQL = 'UPDATE TL
SET '+ quotename(#COLUMN1) + '= AB.COLUMN1,'
+ quotename(#COLUMN2) + '= AB.COLUMN2
FROM ' + quotename(#TABLENAME) + ' TL
JOIN ABACUS AB
ON TL.REF = AB.REF
AND TL.SUBS = AB.SUBS
WHERE ' + quotename(#COLUMN1) + ' IS NULL
AND ' + quotename(#COLUMN2) +' IS NULL';
EXEC (#SQL)
SET #TABLENAME NVARCHAR(10) = 'USERREF'
SET #SQL = 'UPDATE TL
SET '+ quotename(#COLUMN1) + '= AB.COLUMN1,'
+ quotename(#COLUMN2) + '= AB.COLUMN2
FROM ' + quotename(#TABLENAME) + ' TL
JOIN ABACUS AB
ON TL.REF = AB.REF
AND TL.SUBS = AB.SUBS
WHERE ' + quotename(#COLUMN1) + ' IS NULL
AND ' + quotename(#COLUMN2) +' IS NULL';
EXEC (#SQL)
Not a huge fan of this but, given that, create a stored procedure OR re-arrange to execute each after updating the #SQL, here is the stored procedure example:
Note this is missing production level things like a transaction, TRY CATCH etc. and is only for an basic UNTESTED example
CREATE PROCEDURE dbo.MyFunQuery
#SQL NVARCHAR(MAX),
#COLUMN1 NVARCHAR(10),
#COLUMN2 NVARCHAR(10),
#TABLENAME NVARCHAR(10)
AS
BEGIN
SET #SQL = 'UPDATE TL
SET '+ #COLUMN1 + '= AB.COLUMN1,'
+ #COLUMN2 + '= AB.COLUMN2
FROM ' + #TABLENAME + ' AS TL
JOIN ABACUS AS AB
ON TL.REF = AB.REF
AND TL.SUBS = AB.SUBS
WHERE ' + #COLUMN1 + ' IS NULL
AND ' + #COLUMN2 + ' IS NULL;';
EXECUTE ( #SQL );
END
--Now to call it:
DECLARE #COLUMN1 NVARCHAR(10) = 'USER_ID8',
#COLUMN2 NVARCHAR(10) = 'USER_ID6';
EXECUTE dbo.MyFunQuery #COLUMN1, #COLUMN2, #TABLENAME='POLICYREF';
EXECUTE dbo.MyFunQuery #COLUMN1, #COLUMN2, #TABLENAME='USERREF';
43/5000
First of all I apologize for my bad english...
I am trying to write the insert procedures of all tables with a single procedure. But I have a problem like this.
DECLARE #jsondata varchar(MAX)
Set #jsondata='[{"RecordId":1,"CreatedUser":0,"CreatedDate":"2020-03-26T14:49:21.210","UpdatedDate":"2020-03-26T14:57:33.420","UpdatedUser":0,"Status":true,"IsDeleted":false,"Name":"Oyun Konsolları","Icon":"videogame_asset","Description":"Oyun Konsolları","Order":1}]';
DECLARE #cn nvarchar(50)
DECLARE #dt nvarchar(50)
DECLARE #ml nvarchar(50)
DECLARE #inserttext varchar(MAX)
DECLARE #selecttext varchar(MAX)
DECLARE #jsoncol varchar(MAX)
DECLARE #tablename varchar(50)
SET #tablename = 'Categories'
SET #inserttext = ' INSERT INTO '+#tablename+' ( ';
SET #selecttext = ' SELECT ';
SET #jsoncol = ') WITH (';
DECLARE #schema nvarchar(max) = N''
DECLARE MY_CURSOR CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT
c.name 'Column Name',
t.Name 'Data type',
c.max_length 'Max Length'
FROM
sys.columns c
INNER JOIN
sys.types t ON c.user_type_id = t.user_type_id
WHERE
c.object_id = OBJECT_ID(#tablename)
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR INTO #cn,#dt,#ml
WHILE ##FETCH_STATUS = 0
BEGIN
IF(#cn NOT IN('CreatedUser','CreatedDate','UpdatedDate','UpdatedUser','Status','IsDeleted','RecordId','Status','IsDeleted'))
BEGIN
--Do something with Id here
SET #inserttext = #inserttext + '['+#cn + '], ';
SET #selecttext = #selecttext + '['+ #cn + '], ';
IF(#dt = 'varchar' OR #dt='nvarchar' )
BEGIN
SET #jsoncol = #jsoncol + '['+#cn + '] ' + #dt + ' (' +#ml + '), '
END
ELSE
BEGIN
SET #jsoncol = #jsoncol + '['+#cn + '] ' + #dt +', '
END
END
FETCH NEXT FROM MY_CURSOR INTO #cn,#dt,#ml
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
SET #jsoncol = LEFT(#jsoncol, LEN(#jsoncol) - 1)
SET #inserttext = LEFT(#inserttext, LEN(#inserttext) - 1)
SET #selecttext = LEFT(#selecttext, LEN(#selecttext) - 1)
SET #inserttext =#inserttext + ' )';
SET #jsoncol = #jsoncol + ' )';
EXEC( #inserttext + ' '+ #selecttext + ' ' +' FROM OPENJSON('+#jsondata+ #jsoncol);
Error i get after running :
Msg 103, Level 15, State 4, Line 1 The identifier that
starts with
'{"RecordId":1,"CreatedUser":0,"CreatedDate":"2020-03-26T14:49:21.210","UpdatedDate":"2020-03-26T14:57:33.420","UpdatedUser":0,"S'
is too long. Maximum length is 128.
Completion time: 2020-09-25T10:42:41.2474477+03:00
29/5000
Is it possible ?
in short, is it possible to insert into tables from json as dynamic exec
declare #sql nvarchar(max) = #inserttext + ' '+ #selecttext + ' ' +' FROM OPENJSON(#thejsondata'+ #jsoncol;
exec sp_executesql #stmt=#sql, #params=N'#thejsondata nvarchar(max)', #thejsondata = #jsondata;
I try to call declare temp table in my query but it say
"Must declare the table variable "#MDLTable"."
Here my coding:
DECLARE #dbname AS NVARCHAR(50);
SELECT #dbname = DB_NAME();
PRINT #dbname;
DECLARE #sql NVARCHAR(1000) ;
DECLARE #MDLTable AS TABLE(MDLID BIGINT, MDLRLVR INT)
SET #sql = 'INSERT INTO ' + #MDLTable + ' (MDLID, MDLRLVR)
SELECT DISTINCT a.MDLID, a.MDLRLVR FROM ' + #dbname + '.dbo.EUSYSRSRRL a
INNER JOIN ' + #dbname + '.dbo.EUSYSIROE b ON a.MDLID = b.MDLID
INNER JOIN ' + #dbname + '.dbo.EUSYSEAPML c ON b.EAPMLID = c.EAPMLID
WHERE c.REEID = ' + CONVERT(nvarchar(50),6) + ''
exec (#sql);
You can do this by using insert . . . exec:
SET #sql = '
SELECT DISTINCT a.MDLID, a.MDLRLVR
FROM ' + #dbname + '.dbo.EUSYSRSRRL a JOIN
' + #dbname + '.dbo.EUSYSIROE b
ON a.MDLID = b.MDLID JOIN
' + #dbname + '.dbo.EUSYSEAPML c
ON b.EAPMLID = c.EAPMLID
WHERE c.REEID = ' + CONVERT(nvarchar(50), 6) + '';
INSERT INTO #MDLTable (MDLID, MDLRLVR)
exec(#sql);
I have a problem with my stored procedure :
ALTER PROCEDURE [dbo].[Sp_Calculate_TimeSheet_Global_Info]
#DateDebut date,
#DateFin date,
#UserId int,
#CA varchar(10)
AS
BEGIN
DECLARE #TaskQuery nvarchar(MAX) ;
DECLARE #OPENQUERY nvarchar(MAX),#TSQL nvarchar(MAX), #LinkedServer nvarchar(MAX);
DECLARE #DateDebut1 date;
DECLARE #DateFin1 date;
DECLARE #UserId1 int;
DECLARE #Query nvarchar(MAX);
DECLARE #cond1 nvarchar(MAX);
DECLARE #cond2 nvarchar(MAX);
DECLARE #cond3 nvarchar(MAX);
DECLARE #cond4 nvarchar(MAX);
DECLARE #cond5 nvarchar(MAX);
DECLARE #cond6 nvarchar(MAX);
DECLARE #cond7 nvarchar(MAX);
DECLARE #cond8 nvarchar(MAX);
DECLARE #cond9 nvarchar(MAX);
DECLARE #cond10 nvarchar(MAX);
DECLARE #cond11 nvarchar(MAX);
DECLARE #cond12 nvarchar(MAX);
DECLARE #cond13 nvarchar(MAX);
DECLARE #op nvarchar(MAX);
DECLARE #where nvarchar(MAX);
DECLARE #exec nvarchar(MAX);
SET NOCOUNT ON;
SET #LinkedServer = 'TASK'
SET #OPENQUERY = 'SELECT * FROM OPENQUERY('+ #LinkedServer + ','''
SET #DateDebut1 = #DateDebut;
SET #DateFin1 = #DateFin;
SET #UserId1 = #UserId;
set #op = ' UNION ';
set #where = ' where 1=1 ';
set #cond1 = ' LEFT OUTER JOIN tickets tkt ON tkt.ttick_id = h.ttick_id ';
set #cond2 = ' RIGHT OUTER JOIN tickets tkt ON tkt.ttick_id = h.ttick_id ';
set #cond3 = ' LEFT OUTER JOIN ptasks tsk ON h.ptask_id = tsk.ptask_id ';
set #cond4 = ' RIGHT OUTER JOIN tasks tsk ON h.ptask_id = tsk.ptask_id ';
set #cond5 = ' LEFT OUTER JOIN phases ph ON tsk.phase_id = ph.phase_id ';
set #cond6 = ' RIGHT OUTER JOIN tasks tsk ON h.ptask_id = tsk.ptask_id ';
set #cond7 = ' LEFT OUTER JOIN projects p ON ph.proj_id = p.proj_id ';
set #cond8 = ' RIGHT OUTER JOIN projects p ON ph.proj_id = p.proj_id ';
set #cond9 = ' and h.hours_spent >= str_to_date(''''' + convert(varchar,#DateDebut,103) + ''''', ''''%d/%m/%Y'''')';
set #cond10 = ' and h.hours_spent <= str_to_date(''''' + convert(varchar,#DateFin,103) + ''''', ''''%d/%m/%Y'''')';
set #cond11 = ' and h.user_id=' + cast(#UserId as varchar);
set #cond12 = ' and
( ph.phase_name like ''''' + '%' + #CA +'%' +''''' and (p.proj_name not like ''''' + '%' + #CA +'%' +''''' or p.proj_name is null) ) or
( (ph.phase_name not like ''''' + '%' + #CA +'%' +''''' or ph.phase_name is null) and (p.proj_name not like ''''' + '%' + #CA +'%' +''''' or p.proj_name is null) and tsk.ptask_name like ''''' + '%' + #CA +'%' +''''') or
( (ph.phase_name not like ''''' + '%' + #CA +'%' +''''' or ph.phase_name is null) and (p.proj_name not like ''''' + '%' + #CA +'%' +''''' or p.proj_name is null) and (tsk.ptask_name not like ''''' + '%' + #CA +'%' +''''' or tsk.ptask_name is null) and tkt.ttick_name like ''''' + '%' + #CA +'%' +''''') or
( (p.proj_name not like ''''' + '%' + #CA +'%' +''''' or p.proj_name is null) and tsk.ptask_name like ''''' + '%' + #CA +'%' +''''' and (tsk.phase_id is null or tsk.phase_id =-1) ) or
( (p.proj_name not like ''''' + '%' + #CA +'%' +''''' or p.proj_name is null) and tkt.ttick_name like ''''' + '%' + #CA +'%' +''''')
';
set #cond13 = ''') src';
SET #TaskQuery =N' SELECT h.hours_id , h.hours_spent as TimeSheet_Date, h.hours_hours as Hour_Number,h.hours_note as Hour_Note,(case when h.ttick_id is null or h.ttick_id=-1 then tsk.ptask_name else tkt.ttick_name end) as Task_Ticket_Libelle,(case when h.ttick_id is null or h.ttick_id=-1 then h.ptask_id else h.ttick_id end) as Task_Ticket_Id,h.proj_id as Project_Id,(case when h.ttick_id is null or h.ttick_id=-1 then 1 else 0 end) as Is_Task,h.user_id as User_Id,p.proj_name as Project_Name, u.user_uname as User_Name from users u RIGHT OUTER JOIN user_hours h on u.user_id=h.user_id ' ;
SET #Query = #TaskQuery ;
SET #TaskQuery = #Query+ #cond1 ;
SET #TaskQuery = #TaskQuery + #op + #Query + #cond2 ;
SET #Query = #TaskQuery ;
SET #TaskQuery = #Query + #cond3 ;
SET #TaskQuery =#TaskQuery + #op + #Query + #cond4 ;
SET #Query = #TaskLandQuery ;
SET #TaskQuery = #Query + #cond5 ;
SET #TaskQuery =#TaskQuery + #op + #Query + #cond6 ;
SET #Query = #TaskQuery ;
SET #TaskQuery = #Query + #cond7 ;
SET #TaskQuery =#TaskQuery + #op + #Query + #cond8 ;
SET #TaskQuery = #TaskQuery + #where ;
IF(#DateDebut is not null)
BEGIN
SET #TaskQuery = #TaskQuery + #cond9 ;
END
IF(#DateFin is not null)
BEGIN
SET #TaskQuery =#TaskQuery + #cond10 ;
END
IF(#UserId is not null)
BEGIN
SET #TaskQuery = #TaskQuery + #cond11 ;
END
IF(#CA is not null)
BEGIN
SET #TaskQuery = #TaskQuery + #cond12 ;
END
set #TaskQuery = #TaskQuery + #cond13 ;
set #exec = #OPENQUERY+#TaskQuery;
delete from [dbo].[Timesheet_Global_Info];
insert into [dbo].[Timesheet_Global_Info](
[hours_id]
,[TimeSheet_Date]
,[Hour_Number]
,[Hour_Note]
,[Task_Ticket_Libelle]
,[Task_Ticket_Id]
,[Project_Id]
,[Is_Task]
,[User_Id]
,[Project_Name]
,[User_Name]
)
EXEC (#exec) ;
END
When I execute this procedure, I get this error:
Msg 103, Level 15, State 1, Line 3
The string that starts with SELECT h.hours_id, h.hours_spent have TimeSheet_Date, h.hours_hours have Hour_Number, h.hours_note have Hour_Note, (CASE WHEN h.ttick 'is too long. The maximum length is 8000.
the exception is due to this line EXEC (#exec) ; .
So I need to know
What is the reason of this error?
How can I fix it?
You are using OPENQUERY and as per MSDN, the max size for query is 8KB i.e. 8000 characters which is exceeding in your query.
OPENQUERY ( linked_server ,'query' )
' query ' Is the query string executed in the linked server. The
maximum length of the string is 8 KB.
Why not use sp_executesql?
EXEC sp_executesql #exec
As I can see #exec is nvarchar(max), you can pass it without a problem.
On 64-bit servers, the size of the string is limited to 2 GB, the maximum size of nvarchar(max).
EDIT
Use sp_executesql INSTEAD of OPENQUERY
DECLARE #paramDef nvarchar(max) = '#TaskQuery nvarchar(max)'
SELECT #exec = 'INSERT INTO [dbo].[Timesheet_Global_Info] EXEC '+QUOTENAME(#LinkedServer)+'.database.dbo.sp_executesql #TaskQuery',
EXEC sp_executesql #exec, #paramDef, #TaskQuery=#TaskQuery
You exceed the max length character, in this type of case you have to split your dynamic query in multiple part and execute by combine.
Declare #Query1 VARCHAR(MAX),#Query2 VARCHAR(MAX)
SET #Query1='SELECT * FROM'
SET #Query2=' Employee'
EXEC (#Query1+#Query2)
In your case may be
EXEC (#OPENQUERY+#TaskQuery);
If you still got same error, please split your variables into more...
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.