SQL Server表到json
我希望从表中提取一些列Col1和col2,并将其转换为JSON格式,同时在每个节点中编写一些硬编码的JSON,如下所示 {col1:xxxx,col2:xxxx,硬编码字符串:xxxx, 硬编码字符串:xxxx,硬编码字符串:xxxx, 硬编码字符串:xxxx,硬编码字符串:xxxx} 我发现了下面的git脚本,它创建了一个应该生成JSON的SP,但是当我按照要求执行时,我得到了“Commands Completed successfully” 你知道输出的方向吗?或者确实是一种更好的方式来实现我的JSONSQL Server表到json,sql,json,sql-server-2008,Sql,Json,Sql Server 2008,我希望从表中提取一些列Col1和col2,并将其转换为JSON格式,同时在每个节点中编写一些硬编码的JSON,如下所示 {col1:xxxx,col2:xxxx,硬编码字符串:xxxx, 硬编码字符串:xxxx,硬编码字符串:xxxx, 硬编码字符串:xxxx,硬编码字符串:xxxx} 我发现了下面的git脚本,它创建了一个应该生成JSON的SP,但是当我按照要求执行时,我得到了“Commands Completed successfully” 你知道输出的方向吗?或者确实是一种更好的方式来实现
create procedure [dbo].[GetJSON] (
@schema_name varchar(50),
@table_name varchar(50),
@registries_per_request smallint = null
)
as
begin
if ( ( select count(*) from information_schema.tables where table_schema = @schema_name and table_name = @table_name ) > 0 )
begin
declare @json varchar(max),
@line varchar(max),
@columns varchar(max),
@sql nvarchar(max),
@columnNavigator varchar(50),
@counter tinyint,
@size varchar(10)
if (@registries_per_request is null)
begin
set @size = ''
end
else
begin
set @size = 'top ' + convert(varchar, @registries_per_request)
end
set @columns = '{'
declare schemaCursor cursor for
select column_name
from information_schema.columns
where table_schema = @schema_name
and table_name = @table_name
open schemaCursor
fetch next from schemaCursor into @columnNavigator
select @counter = count(*)
from information_schema.columns
where table_schema = @schema_name
and table_name = @table_name
while @@fetch_status = 0
begin
set @columns = @columns + '''''' + @columnNavigator + ''''':'''''' + convert(varchar, ' + @columnNavigator + ') + '''''''
set @counter = @counter - 1
if ( 0 != @counter )
begin
set @columns = @columns + ','
end
fetch next from schemaCursor into @columnNavigator
end
set @columns = @columns + '}'
close schemaCursor
deallocate schemaCursor
set @json = '['
set @sql = 'select ' + @size + '''' + @columns + ''' as json into tmpJsonTable from [' + @schema_name + '].[' + @table_name + ']'
exec sp_sqlexec @sql
select @counter = count(*) from tmpJsonTable
declare tmpCur cursor for
select * from tmpJsonTable
open tmpCur
fetch next from tmpCur into @line
while @@fetch_status = 0
begin
set @counter = @counter - 1
set @json = @json + @line
if ( 0 != @counter )
begin
set @json = @json + ','
end
fetch next from tmpCur into @line
end
set @json = @json + ']'
close tmpCur
deallocate tmpCur
drop table tmpJsonTable
select @json as json
end
end
在ruby中使用mysql2 gem和json
require 'mysql2'
require 'json'
client = Mysql2::Client.new(:host => "localhost", :username => "user", :password => "your_pass", :database => "db_name")
results = client.query("SELECT col1, col2 FROM table LIMIT 3").to_a
results.each do |res|
res.merge!({:hardcoded => "xxxx", :hardcoded2 => "xxxxy"})
end
puts JSON.generate results
我不建议这样做,在应用程序层有更好的方法,但是下面的方法避免了循环,并且比您当前的方法要简单得多:
CREATE PROCEDURE dbo.GetJSON @ObjectName VARCHAR(255), @registries_per_request smallint = null
AS
BEGIN
IF OBJECT_ID(@ObjectName) IS NULL
BEGIN
SELECT Json = '';
RETURN
END;
DECLARE @Top NVARCHAR(20) = CASE WHEN @registries_per_request IS NOT NULL
THEN 'TOP (' + CAST(@registries_per_request AS NVARCHAR) + ') '
ELSE ''
END;
DECLARE @SQL NVARCHAR(MAX) = N'SELECT ' + @Top + '* INTO ##T ' +
'FROM ' + @ObjectName;
EXECUTE SP_EXECUTESQL @SQL;
DECLARE @X NVARCHAR(MAX) = '[' + (SELECT * FROM ##T FOR XML PATH('')) + ']';
SELECT @X = REPLACE(@X, '<' + Name + '>',
CASE WHEN ROW_NUMBER() OVER(ORDER BY Column_ID) = 1 THEN '{'
ELSE '' END + Name + ':'),
@X = REPLACE(@X, '</' + Name + '>', ','),
@X = REPLACE(@X, ',{', '}, {'),
@X = REPLACE(@X, ',]', '}]')
FROM sys.columns
WHERE [Object_ID] = OBJECT_ID(@ObjectName)
ORDER BY Column_ID;
DROP TABLE ##T;
SELECT Json = @X;
END
注意:我已经更改了由两部分组成的对象名@schema和@table,以便只接受完整的对象名
其基本思想是在SQLServer中使用XML扩展将表转换为XML,然后用{ColumnName:和带有的结束标记,。然后需要再进行两次替换,以停止将结束括号添加到每行的最后一列,并从JSON字符串中删除最后一列。从JSON的神奇词语中使用
例如:
SELECT name, surname
FROM emp
FOR JSON AUTO
结果:
[{"name": "John"}, {"name": "Jane", "surname": "Doe"}]
更多信息请访问:
您为什么必须在SQL中执行此操作?没有任何原因-简化的问题陈述是将SQL Server表内容转换为questionGreat中提供的JSON格式,如何运行此操作?我建议使用安装ruby,然后运行“gem安装mysql2”,您需要安装libmysqlclient dev。将此代码复制到.rb文件中,并使用ru运行它顺便说一句。谢谢,这将在我的项目中引入另一种技术,如果可能的话,我想避免这种技术。我将坚持使用SQL cmd格式化json,然后尝试输出到一个平面文件。不过我会看看ruby,因为它似乎是一种适用于许多服务器端mw作业的灵活解决方案。还有一个问题,MySQL vs MSSQL?太棒了,这是ram,效果不错。如何将结果输出到.js文件?您需要自动将其输出到.js文件还是一次性输出?嘿,是的,需要自动输出到.js文件,我正在考虑将sp包装到SSIS包中,但在SSMS SSIS向导中会出现错误。这只适用于一个表。但请尝试转换rt两个表时,结果不正确。这仅适用于一个表。但尝试转换两个表时,结果不正确。