是否可以使用动态参数(如sp_executesql)编写存储过程(在tsql或其他变体中)?
即。事先未知的参数的数量和类型应该在客户端动态构建。 只是将任何类型的任意数量的参数传递给sp_executesql的方式。
答案 0 :(得分:1)
你可以将数组作为字符串传递,其中包含一些分隔符,如val1 $ datatype1 $; val2 $ datatype2 ... 使用循环来构建字符串。 有点老派但在客户端和服务器端很容易做到。
一块XML会更好,你可以使用XML函数在服务器上对它进行转换(对我来说它们有点麻烦)。
如果您对值有更复杂的处理,可以考虑使用服务器端.NET过程。
答案 1 :(得分:0)
我想你可以,但是你必须在数据库服务器端提供一个解析器来解释这些参数和值。您还必须放弃运行时编译的好处,或者以某种方式自己做。
您可能还有一长串可选的INPUT参数......
您是否有一些令人信服的理由不想使用sp_executesql?
答案 2 :(得分:0)
我使用自定义字段。类型和数量未知。
我可以使用sp_executesql。 问题是它不是1,2,3简单的更新。 这就像将一个长存储过程传递给sp_executesql。 如果变化很小,就会产生性能问题。
我想使用存储过程并多次调用带有params的sp_executesql。 至少静态部分是编译的,总的来说它比动态构建整个存储过程要快。
总结性能是主要关注点
答案 3 :(得分:0)
进一步澄清,它将与C#中的类似:
void StoredProcedure(params object [] dynamicFields)
{
// begin tran
// ......在这里工作
sp_executesql(SQL11,dynamicFields);
// ......在这里工作
sp_executesql(SQL22,dynamicFields);
// ......在这里工作
sp_executesql(SQL33,dynamicFields);
// ......在这里工作
// commit tran
}
您可以使用任何数量或类型的参数调用它 或者认为是C ++ var args
答案 4 :(得分:0)
查看已接受的答案in this question。这里建议我使用MS SQL的内置XML函数来构造动态where子句。
澄清一下:我建议你用XML包装你的动态参数。
答案 5 :(得分:0)
类型和数量未知?你可以在数组的各个参数和.Length上使用.getType()来获得它。 从中构建XML片段并将其作为一个参数推送到只有一个xml输入参数的SP中。 .getType()也适用于普通对象(),如果它们被分配了类型对象。
答案 6 :(得分:0)
是的,始终可以构建整个sql字符串并将其传递给存储过程。 但是这样你就无法获得sql paramaterization的性能和安全性优势。 sp_executesql的全部原因优先于adhoc sql。 如果我没有任何其他选择,我将不得不做类似的事情(尽管有点不同)