我正在使用CodeIgniter和MSSQL Server开发自定义应用程序。我在这里使用存储过程。 现在我想知道实现codeigniter查询类型的功能,以便可以在SQL Server中创建通用存储过程,并且在使用时可以传递表名,字段和值的数组。 它可以同时用于插入和更新。
就像我们在CodeIgniter中执行查询一样,
$data = array('fieldname1' => 'value1',
'fieldname2' => 'value2');
$this->db->insert($tablename,$data);
就像这样,如果我们可以将表名和数据数组传递给存储过程,然后存储过程会自动执行它。
如果可以做到,则可以节省大量的工时。如果有人已经做过,我将非常高兴看到解决方案。
答案 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