Sql server 存储过程SQL中的Where子句

Sql server 存储过程SQL中的Where子句,sql-server,stored-procedures,Sql Server,Stored Procedures,存储过程新手-有人能帮我解决这个问题吗?我想实现以下简单的目标: 更新表A设置列A=新值,其中列A=旧值 但是将其转换为存储过程是有问题的 alter PROC test_proc @ColumnValue as Varchar(100), @TableValue as Varchar(50), @NewValue as Varchar(50), @OldValue as Varchar(50) as begin Declare @Pointer VarChar(1000) Declar

存储过程新手-有人能帮我解决这个问题吗?我想实现以下简单的目标:

更新表A设置列A=新值,其中列A=旧值

但是将其转换为存储过程是有问题的

alter PROC test_proc
@ColumnValue as Varchar(100),
@TableValue as Varchar(50),
@NewValue as Varchar(50),
@OldValue as Varchar(50)
as
begin

Declare @Pointer VarChar(1000)  

Declare Test_Cur Cursor For     
    Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + '''' 
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @OldValue
    and column_name = @ColumnValue
    and TABLE_NAME like @TableValue

Open Test_Cur  
-- Loop the cursor and execution of requests     
Fetch Next From Test_Cur Into @Pointer     
    While (@@Fetch_Status = 0)
    Begin  
      Print   @Pointer 
    Execute (@Pointer)     
    Fetch Next From Test_Cur Into @Pointer     
    End  

-- Closing the cursor and releasing resources     
    Close Test_Cur    
    Deallocate Test_Cur     
    Print 'Update complete!'

end

exec dbo.test_proc @ColumnValue = 'USERCHANGED',@TableValue = 'H_%',    @OldValue = '12', @NewValue = '14'

如果我删除“Where column_name=@OldValue”这一行,问题就会出现,但这并不能帮助我实现目标。请提供建议。

这是光标的逻辑:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + '''' 
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @OldValue and
----------^
          column_name = @ColumnValue and
----------^
          TABLE_NAME like @TableValue;
第一和第二个条件相互冲突。我认为你的意图只是:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + '''' 
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @ColumnValue and
          TABLE_NAME like @TableValue;
您可能希望将
@ColumnValue
重命名为类似于
@ColumnName
的名称,这似乎更适合它的使用

编辑:

我认为你的意图是:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + ''' where ' + COLUMN_NAME + ' = ''' + @NewValue + ''''
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @ColumnValue and
          TABLE_NAME like @TableValue;

这是光标的逻辑:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + '''' 
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @OldValue and
----------^
          column_name = @ColumnValue and
----------^
          TABLE_NAME like @TableValue;
第一和第二个条件相互冲突。我认为你的意图只是:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + '''' 
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @ColumnValue and
          TABLE_NAME like @TableValue;
您可能希望将
@ColumnValue
重命名为类似于
@ColumnName
的名称,这似乎更适合它的使用

编辑:

我认为你的意图是:

   Select 'Update ' + TABLE_NAME + ' set ' + COLUMN_NAME + ' = ''' + @NewValue + ''' where ' + COLUMN_NAME + ' = ''' + @NewValue + ''''
    From INFORMATION_SCHEMA.COLUMNS 
    Where column_name = @ColumnValue and
          TABLE_NAME like @TableValue;

我想你混合了内部和外部,试试这个(我无法检查,可能是我放错了顶点):


我想你混合了内部和外部,试试这个(我无法检查,可能是我放错了顶点):


啊,对不起,按enter键太快了,我要试一试。。非常感谢!啊,对不起,按enter键太快了,我要试一试。。非常感谢!你不接受答案的原因是什么?你不接受答案的原因是什么?