SQL Server CLR存储过程JSON参数

时间:2009-09-16 09:35:47

标签: c# sql-server json stored-procedures clr

我遇到过一种情况,我希望将大量数据传递给存储过程以生成一些动态SQL。

我想传递的数据存储在我在ASP.NET MVC Web项目中使用的这个Json / C#类对象中。

[
 {
  "code":"ABC123",
  "Count": "12998",
  "Params":
  [
    {"name": "Recent", "value": "0-12m"},
    {"name": "Orders", "value": "1"}
  ]
 },
 {
  "code":"ABC124",
  "Count": "13998",
  "Params":
  [
   {"name": "Recent", "value": "0-12m"},
   {"name": "Orders", "value": "2"}
  ]
 },
 {
  "code":"ABC125",
  "Count": "7998",
  "Params":
  [
   {"name": "Recent", "value": "0-12m"},
   {"name": "Orders", "value": "3"}
  ]
 }
]
.....

然后使用此text参数转换回JSON对象,我在动作过滤器中将其用于将其转换为对象。

public class ObjectFilter : ActionFilterAttribute
{

    public string Param { get; set; }

    public Type RootType { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        if ((filterContext.HttpContext.Request.ContentType ?? string.Empty).Contains("application/json"))
        {

            object o =

            new DataContractJsonSerializer(RootType).ReadObject(filterContext.HttpContext.Request.InputStream);
            filterContext.HttpContext.Request.InputStream.Seek(0, SeekOrigin.Begin); // Rewind InputStream for other filters

            filterContext.ActionParameters[Param] = o;

        }

        else
        {

            var xmlRoot = XElement.Load(new StreamReader(filterContext.HttpContext.Request.InputStream,

            filterContext.HttpContext.Request.ContentEncoding));

            object o = new XmlSerializer(RootType).Deserialize(xmlRoot.CreateReader());

            filterContext.ActionParameters[Param] = o;

        }

    }

}

然后在我的CLR存储过程中使用C#等创建一个SQL语句,如:

UPDATE [Sample]
SET [Field] =
CASE
WHEN [Recent] = "0-12m" AND [Orders] = "1" THEN "ABC123"
WHEN [Recent] = "0-12m" AND [Orders] = "2" THEN "ABC124"
WHEN [Recent] = "0-12m" AND [Orders] = "3" THEN "ABC125"
...

这是否可行,有没有人做过这样的事情。我看过一些关于使用XML参数的帖子,但没有使用使用反序列化(?)json的varchar参数。

3 个答案:

答案 0 :(得分:1)

有可能;请参阅有关动态SQL的规范参考:The Curse and Blessings of Dynamic SQL

答案 1 :(得分:1)

我尝试使用我的代码来解析JSON字符串参数,但SQL CLR项目中没有所需的命名空间,因此我已切换到记录的Xml参数。

答案 2 :(得分:1)

如果您自己构建不安全的程序集,则只能使用不安全的程序集,例如DataContractJsonSerializer。另一个选择是跳过对不安全程序集的引用和使用,并编写自己的JSON解析代码(或从其他人复制它。)