是否可以使用sp_executesql等动态参数编写存储过程?

时间:2008-10-22 06:00:57

标签: sql-server tsql

是否可以使用动态参数(如sp_executesql)编写存储过程(在tsql或其他变体中)?

即。事先未知的参数的数量和类型应该在客户端动态构建。 只是将任何类型的任意数量的参数传递给sp_executesql的方式。

7 个答案:

答案 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。 如果我没有任何其他选择,我将不得不做类似的事情(尽管有点不同)