我遇到过一种情况,我希望将大量数据传递给存储过程以生成一些动态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参数。
答案 0 :(得分:1)
有可能;请参阅有关动态SQL的规范参考:The Curse and Blessings of Dynamic SQL
答案 1 :(得分:1)
我尝试使用我的代码来解析JSON字符串参数,但SQL CLR项目中没有所需的命名空间,因此我已切换到记录的Xml参数。
答案 2 :(得分:1)
如果您自己构建不安全的程序集,则只能使用不安全的程序集,例如DataContractJsonSerializer。另一个选择是跳过对不安全程序集的引用和使用,并编写自己的JSON解析代码(或从其他人复制它。)