我有一个包含许多存储过程的数据驱动站点。我最终想要做的是说:
For Each @variable in sproc inputs
UPDATE @TableName SET @variable.toString = @variable
Next
我希望它能够接受任意数量的论点。
它将基本循环遍历所有输入并使用变量的值更新列的变量名称 - 例如,列“Name”将使用@Name的值更新。我想基本上有一个存储过程用于更新,一个用于创建。但是要做到这一点,我需要能够将变量的实际名称而不是值转换为字符串。
问题1:是否可以在T-SQL中执行此操作,如果可以,如何执行此操作?
问题2:使用类似的东西(如性能或CPU使用率)是否有任何重大缺点?
我知道如果一个值无效,那么它只会阻止涉及该变量和任何后续变量的更新,但所有数据都在vb.net代码中得到验证,因此在提交到数据库时始终有效,我将确保只能提交列存在的变量。
非常感谢,
此致
理查德克拉克编辑:
我知道使用SQL字符串和SQL注入攻击的风险 - 几周前我在论文中对此进行了一些研究。
基本上,该网站使用面向对象的架构。有许多类 - 例如Product - 有许多“属性”(我创建了自己的类,名为Attribute,它具有DataField,Name和Value等属性,其中DataField用于获取或更新数据,Name显示在管理中创建或更新产品时的前端,可能显示在客户前端的值由管理员设置.DataField是我将在“UPDATE Blah SET @Field = @Value”中使用的字段。
我知道这可能令人困惑,但解释起来却很复杂 - 我对整个系统的理解非常好,但我不能轻易将其写成文字。
基本上,设置结构使得任何用户都无法更改DataField或Name的值,但是他们可以更改Value。我想如果我使用动态参数化SQL字符串,那么就不存在SQL注入攻击的风险。
我的意思是基本上循环遍历所有属性,以便最终像:
UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display
然后再次遍历所有属性并添加参数值 - 这将与使用存储过程具有相同的效果,对吧?
我不介意添加页面加载时间,因为这主要会影响管理前端,并且会对客户端口产生微不足道的影响。
答案 0 :(得分:2)
问题1:您必须使用动态SQL - 将更新语句构造为字符串,并使用EXEC
命令运行它。
问题2:是的 - SQL注入攻击,错误形成查询的风险,增加了必须编译单独SQL语句的开销。
答案 1 :(得分:2)
您的示例效率非常低,因此如果我传入10列,您将更新同一个表10次?
更好的方法是使用 sp_executesql 进行一次更新并动态构建,请查看The Curse and Blessings of Dynamic SQL以了解如何操作
答案 2 :(得分:0)
这是一个新系统,您可以根据需要自由设计,还是坚持使用现有的数据库设计?
您可以考虑将属性表示为不作为列,而是将其表示为子表中的行。
在父MyObject中,你只有头级数据,这是系统中所有对象共有的东西(可能只是一个标识符)。在子表MyObjectAttribute中,您将拥有另一列attrValue的主键。这样你可以像这样进行更新:
UPDATE MyObjectAttribute
SET attrValue = @myValue
WHERE objectID = @myID
AND attrName = @myAttrName