Параметр JSON хранимой процедуры в SQL Server CLR - PullRequest
1 голос
/ 16 сентября 2009

Я столкнулся со сценарием, в котором я хочу передать большой объем данных в хранимую процедуру для генерации динамического SQL.

Данные, которые я хочу передать, хранятся в этом объекте класса Json / C #, который я использую в своем веб-проекте ASP.NET MVC.

[
 {
  "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"}
  ]
 }
]
.....

Затем используйте этот текстовый параметр для преобразования обратно в объект 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;

        }

    }

}

, а затем используйте C # и т. Д. В моей хранимой процедуре CLR для создания оператора 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, но ни один не использовал параметр varchar с использованием десериализованного (?) Json.

Ответы [ 3 ]

1 голос
/ 22 сентября 2009

Я пытался использовать мой код для анализа строкового параметра JSON, но необходимые пространства имен недоступны в проекте SQL CLR, и поэтому я перешел на документированный параметр Xml.

1 голос
/ 28 сентября 2011

Вы можете использовать небезопасную сборку, такую ​​как DataContractJsonSerializer, только если вы строите небезопасную сборку самостоятельно. Другой вариант - пропустить ссылку на небезопасную сборку и использовать ее и написать собственный код синтаксического анализа JSON (или скопировать его от кого-либо еще).

1 голос
/ 16 сентября 2009

Возможно; см. канонический справочник по динамическому SQL: Проклятие и благословения динамического SQL

...