SQL Server存储过程-基于变量名更新列。。?
我有一个包含许多存储过程的数据驱动站点。我希望最终能够说的是:SQL Server存储过程-基于变量名更新列。。?,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,我有一个包含许多存储过程的数据驱动站点。我希望最终能够说的是: For Each @variable in sproc inputs UPDATE @TableName SET @variable.toString = @variable Next 我希望它能够接受任何数量的论点 它基本上会遍历所有的输入,并用变量的值更新带有变量名称的列-例如,“name”列将用@name的值更新。我希望基本上有一个用于更新的存储过程和一个用于创建的存储过程。但是要做到这一点,我需要能够将变量的实际名
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的类,该类具有数据字段、名称和值等属性,其中数据字段用于获取或更新数据,在创建或更新产品时,名称显示在管理前端,而值(可能显示在客户前端)由管理员设置。数据字段是我需要的字段将在“更新Blah SET@Field=@Value”中使用
我知道这可能会让人困惑,但解释起来真的很复杂——我对整个系统有很好的理解,但我不能轻易地用语言表达出来
基本上,该结构是这样设置的:没有用户能够更改数据字段或名称的值,但他们可以更改值。我认为,如果我使用动态参数化SQL字符串,那么就不会有SQL注入攻击的风险
我的意思是,基本上循环所有的属性,这样它就会像:
UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display
然后再次循环所有属性并添加参数值-这将与使用存储过程具有相同的效果,对吗
我不介意增加页面加载时间,因为这将主要影响管理前端,并将对客户前端产生重大影响。问题1:您必须使用动态SQL-将update语句构造为字符串,并使用
EXEC
命令运行它
问题2:是的,存在SQL注入攻击、错误查询的风险、编译单独SQL语句的额外开销。问题1:必须使用动态SQL-将update语句构造为字符串,并使用
EXEC
命令运行
问题2:是的,存在SQL注入攻击、错误查询的风险、必须编译单独SQL语句的额外开销。您的示例效率非常低,因此如果我传入10列,您会将同一个表更新10次吗
更好的方法是使用sp_executesql进行一次更新,并动态构建,看看如何进行更新您的示例效率很低,因此如果我传入10列,您会将同一个表更新10次吗
更好的方法是使用sp_executesql进行一次更新,并动态构建,看看您必须如何进行更新这是一个新的系统,您可以根据需要自由设计,还是您仍然坚持现有的数据库设计
您可以考虑将属性表示为列,而不是子表中的行。
在父MyObject中,您只需要标题级数据,即系统中所有对象的通用数据(可能只是一个标识符)。在子表MyObject属性中,您需要一个主键和另一列attrValue。通过这种方式,您可以执行如下更新:UPDATE MyObjectAttribute
SET attrValue = @myValue
WHERE objectID = @myID
AND attrName = @myAttrName
这是一个新系统,您可以根据需要自由地进行设计,还是仍然坚持现有的DB设计
您可以考虑将属性表示为列,而不是子表中的行。
在父MyObject中,您只需要标题级数据,即系统中所有对象的通用数据(可能只是一个标识符)。在子表MyObject属性中,您需要一个主键和另一列attrValue。通过这种方式,您可以执行如下更新:UPDATE MyObjectAttribute
SET attrValue = @myValue
WHERE objectID = @myID
AND attrName = @myAttrName
我敢问你为什么要这样做?我想这样做是为了能够添加属性,比如说,来自管理前端的产品。我基本上有一个数组,例如,“经理”中的产品名为ProductManager的类。ProductManager继承自Manager,后者循环遍历Products表中的所有行,并在创建时为每一行创建一个具有正确详细信息的Product实例。我希望对此进行扩展,以便管理员能够添加一个属性,然后他们可以在客户前端上使用该属性。不目前这意味着每次都要更改存储过程..我敢问你为什么要这样做吗?我想这样做是为了能够添加属性,例如,来自管理前端的产品。我基本上有一个数组,例如,“经理”中的产品名为ProductManager的类。ProductManager继承自Manager,后者循环遍历Products表中的所有行,并在创建时为每一行创建一个Product实例,该实例具有正确的详细信息。我希望对此进行扩展,以便admin能够添加一个