2015-04-08 2 views
-3

Когда я пытаюсь создать следующую хранимую процедуру, я получаю это сообщение об ошибке: что я делаю неправильно?Помогите мне исправить эту хранимая процедуру

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 
+2

Вы не можете использовать 'GO' в хранимой процедуре: [HTTP: //stackoverflow.com/a/2310488/1115360](http://stackoverflow.com/a/2310488/1115360). –

+2

у вас есть пакетный разделитель 'GO' в вашем коде –

+1

Просим вас и вашей компании одобрить и« исправить »эту процедуру, переработав, как вы храните эту информацию. SSN никогда не должен храниться как обычный текст. Не шифрование этих данных небрежно. –

ответ

0

Помимо 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 
Смежные вопросы