Alors d'abord, je tiens à remercier Kirill Polishchuk pour l'exemple de code essentiel ... Merci! J'ai pris cela et suis allé construire une procédure pour faire ce que j'ai besoin de faire, et c'est de me donner une sortie JSON basée sur "tout" jeu de résultats je veux dire objet de table (pas variable) dans SQL Server .
Idéalement, je voudrais cela comme une fonction, mais en raison de limitations sur ce que vous pouvez faire dans une fonction, cette partie devra attendre ... peut-être v2. :)
Et oui, l'enregistrement d'une procédure étendue (CLR) est certainement plus facile, mais je voulais éviter cette voie pour l'instant.
PS: pour les tables temporaires, vient de mettre en 'tempdb .. # nom_table'
Ici, il est:
/*
Author: Goran Biljetina
Create date: 03/13/2013
Description: consume a table object (not table var), output it as JSON Properties string
*/
/*
--> example run
-- EXEC dbo.JSONreturn @tblObjNameFQ='[database].[schema].[object_name_table]';
*/
CREATE PROCEDURE dbo.JSONreturn
(
@committedRead bit = 0 --> if 1 then committed else uncommitted read
,@debugmode bit = 0 --> if 1 display certain outputs
,@tblObjNameFQ varchar(128) --> fully qualified table object name, i.e. db.schema.object_name
,@stringJSON nvarchar(max) = null OUTPUT
)
AS
BEGIN
if @committedRead=0
begin
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; --> evaluate if necessary in test phase
end
else if @committedRead=1
begin
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
end
SET NOCOUNT ON;
----------------------------------------------------------------------------------------------------------
if (PATINDEX('%[\.]%',@tblObjNameFQ)<1 AND patindex('%#%',@tblObjNameFQ)<1) OR LEN(@tblObjNameFQ)>(3*128)
begin
PRINT 'table (object) name not fully qualified or invalid!'
RETURN -1
end
declare
@objname varchar(128)
,@dbname varchar(128)
,@schema varchar(128)
,@maxColNum int
,@inc int
,@dqsl_misc varchar(max)
,@dsql_wrapper varchar(max)
,@dsql_what varchar(max)
,@dsql_where varchar(max)
,@dsql_complete varchar(max)
create table #maxColNum (column_id int)
create table #ColPrep (colString varchar(max), column_id int)
create table #JSONoutput (string nvarchar(max))
if patindex('%#%',@tblObjNameFQ)>0
begin
set @objname = (PARSENAME(@tblObjNameFQ,1))
set @dbname = 'tempdb'
end
else if patindex('%#%',@tblObjNameFQ)<1
begin
set @dbname = SUBSTRING(@tblObjNameFQ,1,PATINDEX('%[\.]%',@tblObjNameFQ)-1)
set @objname = convert(varchar,(PARSENAME(@tblObjNameFQ,1)))
set @schema = convert(varchar,(PARSENAME(@tblObjNameFQ,2)))
end
--select @objname[@objname], @dbname[@dbname], @schema[@schema]
--select @dbname+'.'[email protected]+'.'[email protected]
set @dqsl_misc =
'
select max(column_id)
from '[email protected]+'.sys.columns
where object_id =
(select object_id from '[email protected]+'.sys.objects where type = ''U'' and name like ''%'[email protected]+'%'')
'
insert into #maxColNum
exec(@dqsl_misc)
set @maxColNum = (select column_id from #maxColNum)
set @dsql_what = ''
set @dsql_wrapper =
'
select ''['' + STUFF((
select
'',{''+<<REPLACE>>
+''}''
'
set @dsql_where =
'
from '[email protected]+'.'+case when @schema is null then '' else @schema end+'.'[email protected]+' t1
for xml path(''''), type
).value(''.'', ''varchar(max)''), 1, 1, '''') + '']''
'
set @dqsl_misc =
'
select ''"''+sysc.name+''": ''
+case
when syst.name like ''%time%'' or syst.collationid is not null then ''"''''+cast(''+sysc.name+'' as varchar(max))+''''",''
when syst.name = ''bit'' then ''''''+cast((case when ''+sysc.name+''=1 then ''''true'''' else ''''false'''' end) as varchar(max))+'''',''
else ''''''+cast(''+sysc.name+'' as varchar(max))+'''',''
end as colString, sysc.column_id
from '[email protected]+'.sys.columns sysc
join '[email protected]+'.sys.systypes syst
on sysc.system_type_id = syst.xtype and syst.xtype <> 240 and syst.name <> ''sysname''
where object_id = (select object_id from '[email protected]+'.sys.objects where type = ''U'' and name like ''%'[email protected]+'%'')
order by sysc.column_id
'
insert into #ColPrep
exec(@dqsl_misc)
set @inc = (select MIN(column_id) from #ColPrep)
while @inc<[email protected]
begin
set @dsql_what = @dsql_what+(select case
when @inc = @maxColNum then replace(colString,',','')
else colString end
from #ColPrep where column_id = @inc)
set @[email protected]+1
IF @inc>@maxColNum
set @dsql_what = ''''[email protected]_what+''''
IF @inc>@maxColNum
BREAK
ELSE
CONTINUE
end
set @dsql_complete = REPLACE(@dsql_wrapper,'<<REPLACE>>',@dsql_what)[email protected]_where
insert into #JSONoutput
exec(@dsql_complete)
SET @stringJSON = (Select string from #JSONoutput)
----------------------------------------------------------------------------------------------------------
END
Ce n'est pas vraiment quelque chose qui est approprié avec une simple requête SQL. Il est plus logique de le faire avec une sorte de programme qui se trouve devant votre base de données. Quel langage de programmation utilisez-vous pour afficher ces données? – schizodactyl
http://www.adampresley.com/2010/07/experimenting-with-sql-to-json-in-sql.html a un exemple de le faire avec une fonction CLR pour analyser une réponse XML en JSON. Je ne sais pas si vous trouverez une solution viable en T-SQL pur. – Yuck
Et ... qu'avez-vous essayé jusqu'ici? Cela ressemble plus à une * enchère * qu'à une question ... –