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