我遇到過一個場景,我想將大量數據傳遞給存儲過程以生成一些動態SQL。SQL Server CLR存儲過程JSON參數
我想傳遞的數據存儲在我在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"}
]
}
]
.....
然後使用該文本參數轉換回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參數的文章,但沒有使用使用反序列化(?)json的varchar參數的文章。
這可能有助於[在SQL Server中使用JSON字符串](http:// www.simple-talk.com/sql/t-sql-programming/consuming-json-strings-in-sql-server/?utm_source=simpletalk&utm_medium=email-main&utm_content=JSON-20101116&utm_campaign=SQL) – aaroned 2010-11-19 07:19:50