【问题标题】:Please help me fix this stored procedure请帮我修复这个存储过程
【发布时间】:2015-06-13 23:36:48
【问题描述】:

当我尝试创建以下存储过程时,我收到以下错误消息: 我究竟做错了什么?

Create  Procedure uspUpdateWithNewSSN
    (
      @OldSSN VARCHAR(9)
      ,@NewSSN VARCHAR(9)
     )
       AS 
 SET NOCOUNT ON
 BEGIN
If OBJECT_ID(N'NewSSNEXIST') IS NULL
   Begin
    Create Table NewSSNEXIST
    (
       NewSSN nvarchar(9)NOT NULL   
    )
  End

 Begin
    Insert into  NewSSNEXIST
    Exec uspCheckNewSSN @NewSSN
    GO
 End

If (select count(*) from NewSSNEXIST)>0
Begin 
    print 'social security number already used'
    Truncate Table NewSSNEXIST;
    Return
End
Else
 --Begin update ssn 
Begin
--Declare @OldSSN VARCHAR(9)
--Declare @NewSSN VARCHAR(9)
Declare @cmd   VARCHAR(MAX)
--Set @OldSSN='222334444'
--Set @NewSSN='222334644'

 Select @cmd =  COALESCE(@cmd,'') +
'
    UPDATE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] SET [' + Column_Name + '] = ' + @NewSSN + '  
    WHERE [' + Column_Name + '] = ' + @OldSSN + '
 '

From INFORMATION_SCHEMA.COLUMNS
Where Column_Name like 'SSN%'       
OR Column_Name LIKE 'ssn%'          
OR Column_Name LIKE 'ssn%'          
OR Column_Name LIKE '%_ssn%'            
OR Column_Name LIKE '_ocsecno'          
OR Column_Name LIKE 'Ssn%';

--Select @cmd
EXEC(@cmd)
End
    END

      GO

【问题讨论】:

  • 您不能在存储过程中使用GOhttp://stackoverflow.com/a/2310488/1115360
  • 您的代码中有一个批处理分隔符GO
  • 请帮助您自己和您的公司,并通过重新设计您存储此信息的方式来“修复”此过程。 SSN 绝不应以纯文本形式存储。不加密此数据是疏忽大意。
  • 我同意你的看法,肖恩。我继承了一个设计不佳的数据库。我什至不知道从哪里开始修复它。
  • 我将补充 Sean Lange 所说的内容。这不仅是数据疏忽,而且不加密 ssns 和 dobs 等实际上可能是非法的。如果数据泄露,它肯定会让您和您的公司面临大量诉讼。

标签: sql-server tsql stored-procedures dynamic-sql


【解决方案1】:

除了程序中的GO关键字外,您还应该查看动态sql并按如下方式修复它

Declare @cmd   VARCHAR(MAX)

 Select @cmd = N' UPDATE ' + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) 
            +  N' SET  ' + QUOTENAME(c.name)   + N' =  @NewSSN   '
            +  N' WHERE ' + QUOTENAME(c.name)  + N' =  @OldSSN  '

From sys.tables t 
Inner join sys.columns c ON t.object_id = c.object_id
Inner join sys.schemas s on t.schema_id = s.schema_id
Where c.name like 'SSN%'       
OR c.name LIKE 'ssn%'          
OR c.name LIKE 'ssn%'          
OR c.name LIKE '%_ssn%'            
OR c.name LIKE '_ocsecno'          
OR c.name LIKE 'Ssn%';

--Select @cmd
EXEC sp_executesql @cmd
                  ,N' @OldSSN VARCHAR(9) ,@NewSSN VARCHAR(9)'
                  ,@OldSSN
                  ,@NewSSN

【讨论】:

    猜你喜欢
    • 2011-03-10
    • 2012-09-13
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多