如何使用CI在存储过程中将表名,字段名,值作为参数传递?

时间:2019-07-20 03:45:56

标签: sql-server codeigniter

我正在使用CodeIgniter和MSSQL Server开发自定义应用程序。我在这里使用存储过程。 现在我想知道实现codeigniter查询类型的功能,以便可以在SQL Server中创建通用存储过程,并且在使用时可以传递表名,字段和值的数组。 它可以同时用于插入和更新。

就像我们在CodeIgniter中执行查询一样,

    $data = array('fieldname1' => 'value1',
'fieldname2' => 'value2');

$this->db->insert($tablename,$data);

就像这样,如果我们可以将表名和数据数组传递给存储过程,然后存储过程会自动执行它。

如果可以做到,则可以节省大量的工时。如果有人已经做过,我将非常高兴看到解决方案。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您需要使字符串非常具体。 找出您的表名,列名,要插入的列值。对于更新2,还需要其他参数ID列名称及其值。

    GO
    ---- exec InsertUpdate  'tablename', 'col1, col2, col3', 'val1, val2, val3', 'idcol', 'idval'
    GO
    Create proc InsertUpdate 
    ( @TableName nvarchar(500), 
      @ColName nvarchar(max), 
      @ColValues nvarchar(max), 
      @IDColName nvarchar(100) = '', --- for update only otherwise null
      @IdColValue nvarchar(Max) = '' --- for update only otherwise null
    )
    As
    Begin
    declare @Query nvarchar(max)

    if (@IdColValue = '')
    Begin

    set @Query = ' Insert into ' + @TableName + ' (' + @ColName + ') values (' + @ColValues + ')'

    End
    Else
    Begin

    ;with CtColumn as (
    select ROW_NUMBER() over (order by (select 1000)) as Slno, * from Split(@ColName,',') )
    , CtValue as (
    select ROW_NUMBER() over (order by (select 1000)) as Slno, * from Split(@ColValues, ','))
    , CTFinal as (
    select CCOl.Slno, CCOl.Items as ColName, CVal.Items as ColValue  from CtColumn as CCOl inner join CtValue as CVal on CCOl.Slno=CVal.Slno )
    select @Query = 'update ' + @TableName + ' set ' + 
    stuff ( (select ',' + ColName + '=' + ColValue from CTFinal for xml path ('')) ,1,1,'') + 
    ' where ' + @IDColName + '=' + @IdColValue

    End

    exec sp_executesql @Query
    End

    Go