Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我需要帮助写一个存储过程_Sql_Sql Server_Database_Tsql_Stored Procedures - Fatal编程技术网

Sql 我需要帮助写一个存储过程

Sql 我需要帮助写一个存储过程,sql,sql-server,database,tsql,stored-procedures,Sql,Sql Server,Database,Tsql,Stored Procedures,现在,我是否要用存储社会保险号的列作为单个事务更新多个表?我有70多个表要用正确的ssn更新ssn 更新严格按照要求进行。偶尔,我会接到客户的电话,他们第一次在我们的网站上注册时错误地输入了ssn。当我收到这样一个请求时,我会手动更新存储客户信息的每个数据库表中的所有ssn。用ssn列逐个更新70多个表是一项非常繁琐的任务。有人知道如何有效地执行此操作吗?有人能告诉我如何编写一个存储过程,以便传入旧的SSN和新的SSN,然后它相应地更新70个表吗 有人有演示如何编写存储过程的蓝图吗 TableN

现在,我是否要用存储社会保险号的列作为单个事务更新多个表?我有70多个表要用正确的ssn更新ssn

更新严格按照要求进行。偶尔,我会接到客户的电话,他们第一次在我们的网站上注册时错误地输入了ssn。当我收到这样一个请求时,我会手动更新存储客户信息的每个数据库表中的所有ssn。用ssn列逐个更新70多个表是一项非常繁琐的任务。有人知道如何有效地执行此操作吗?有人能告诉我如何编写一个存储过程,以便传入旧的SSN和新的SSN,然后它相应地更新70个表吗

有人有演示如何编写存储过程的蓝图吗

TableName  ColumnName
table1      colA
table2      colB
table3      colC
table4      cold

我查询
信息\u SCHEMA.COLUMNS
视图以检索具有如上所示ssn列的所有表。

如果已经存在多个存储过程,则可以执行它们,或者可以将每个表的更新脚本写入一个新的存储过程中,类似于此结构

DECLARE @OldSSN VARCHAR(9) = "00000000",
        @NewSSN VARCHAR(9) = "00000001"

UPDATE TableName1
SET SSN = @NewSSN
WHERE SSN = @OldSSN

UPDATE TableName2
SET SSN = @NewSSN
WHERE SSN = @OldSSN

正如布拉姆所提到的,正是由于这个原因,将SSN列在一个以上的表中是不好的做法。最好有一个带有SSN的客户机表,然后在所有其他表中使用新创建的ClientId

使用此选项生成所有更新。您可能需要调整WHERE子句

SELECT 
    'UPDATE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] SET [' + Column_Name + ']=@NewSSN WHERE [' + Column_Name + ']=@OldSSN;'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Column_Name ='SSN'
  • 创建一个接受@oldsn和@NewSSN作为参数的存储过程
  • 在上面的SQL中粘贴
  • 包装在事务中

  • 如果在70个表中有SSN,那么就没有标准化的数据库。SSN应该只在一个地方。除了布拉姆所说的,如果不查看您的数据结构,编写特定的查询是非常不可能的;只是Google“tsql存储过程更新表”中的syntax.SSN是个人可识别的信息。这真的应该与其他数据分开,加密,并如布拉姆所说,存储在一个地方。人们想知道为什么塔吉特、索尼、家得宝和其他企业的数据盗窃是大新闻。。。70张桌子70次改变盗取身份…我完全同意你们所有人。我目前工作的地方有一个设计糟糕的数据库。处理这样一个数据库是件麻烦事,别忘了在事务中包装更新。如果要在多个表中更改SSN,则需要更新所有表,或者不更新任何表。我认为“部分成功”的更新会产生负面影响。您可能希望处理这类代码,否则在出现任何错误的情况下,您可能会导致某些表更新,而某些表未更新。很好,但不确定回滚多个更新的最佳语法。您的代码现在很危险。它给人一种检查错误的假象,但@error只告诉你最后执行的语句发生了什么。因此,在您的示例中,如果第一次更新失败,而第二次更新成功,那么您就不会回滚事务。我建议您查看TRY..CATCH块和XACT_ABORT.Thank,它们将删除回滚部分