Como inserir valores de matriz PHP usando um procedimento armazenado SQL SERVER 2008 R2 (mssql)

Eu tenho essa matriz

$REV = Array ( 0 => 240, 1 => 241, 2 => 242, 3 => 243, 4 => 249 ); 

e eu estou usando este código abaixo para inserir por enquanto, armazene o elemento de cada matriz em uma linha com $ id, $ userID, Type and Date

 if (!empty($REV)) { foreach ($REV as $val_rev) { $values_rev[] = "('" . $ID . "','REV','" . $val_rev . "','" . $IDUSER . "',GETDATE())"; } $values_rev_insert = implode(',', $values_rev); $query_rev = "insert into dbo.CCLine (ID,CCType,CSID,IdUSer,DateCreated)values" . $values_rev_insert; mssql_query($query_rev); } 

Mas o que eu quero é usar esse procedimento armazenado, mas eu não tenho idéia de como fazer para inserir em um tempo usando o sp:

 $stmt = mssql_init('sp_insertRev'); mssql_bind($stmt, '@ID', $ID, SQLINT4); mssql_bind($stmt, '@CCType', 'REV', SQLVARCHAR); 

A matriz não funciona aqui

 mssql_bind($stmt, '@CSID', $val_rev, SQLINT4);//An example 

 mssql_bind($stmt, '@IdUSer', $IDUSER, SQLCHAR); $result = mssql_execute($stmt); 

Como posso usar este SP com a matriz

 CREATE PROCEDURE [dbo].[sp_HCCInsert] @ID int ,@CCType varchar(10) ,@CSID varchar(10) ,@IdUSer char(15) AS BEGIN SET NOCOUNT ON; DECLARE @CCID as INT INSERT INTO [dbo].[CCLine] ([ID] ,[CCType] ,[CSID] ,[IdUSer] ,[DateCreated]) VALUES (@ID ,@CCType ,@CSID ,@IdUSer ,GETDATE()) SET @CCID = @@IDENTITY Select @CCID as CCID END 

Encontrei a solução para o seu problema nesta publicação

É sobre a passagem da matriz como seqüência XML que é passada para o procedimento e no procedimento é usado na instrução INSERT SELECT com function OPENXML.

 CREATE PROCEDURE [dbo].[sp_HCCInsert] ( @XMLDoc XML ) 

Em seguida, use a function OPENXML no MSSQL. Você deve ler este tópico. Então parecerá um pseudo código

INSERT ... SELECT OPENXML(@XML...)

Depois de lê-lo e se adequar às suas necessidades, passe o procedimento XML.

Alguns links úteis sobre OPENXML

Além disso, eu sugeriria o uso de PDO porque ele tem melhor camada abstrata. Espero que isso tenha ajudado você.

Eu tendem a usar o PDO em vez das funções mssql_ *, você ainda pode usar o dblib e você pode ligar essa matriz de forma bastante simples. Entretanto, você tem 5 elementos nessa matriz, mas apenas 4 variables ​​de input no seu procedimento armazenado. Este exemplo assumirá que você tem apenas 4 elementos em sua matriz.

 $sql = "EXEC sp_HCCInsert ?, ?, ?, ?"; // SQL string with ? where params should go $pdh = new PDO("dblib:host=somthing.somewhere\\INSTANCENAME;port=1433;dbname=MyDatabase;","username","password"); $sth = $pdh->prepare($sql); // Prepare query $sth->execute($REV); // Execute and bind non-associative array 

O único cuidado com o uso do PDO com dblib no PHP 5.3 ou antes, ele vai e faz uma pré-seleção na execução. Então, se você executar uma consulta enorme e quiser fazer um loop por cada registro, um de cada vez … desculpe, você obtém tudo em buffer primeiro.

Além disso, você pode usar uma matriz associativa se desejar

 $REV = array(":ID" => 240, ":CCType" => 241, ":CSID" => 242, ":IdUSer" => 243); $sql = "EXEC sp_HCCInsert :ID, :CCType, :CSID, :IdUSer"; // SQL string with named params $pdh = new PDO("dblib:host=somthing.somewhere\\INSTANCENAME;port=1433;dbname=MyDatabase;","username","password"); $sth = $pdh->prepare($sql); // Prepare query $sth->execute($REV); // Execute and bind associative array 

A melhor parte é, o método de execução para a DOP :: Statement escapa as cordas! Segurança, primeiro você sabe.

 $sql = "INSERT INTO table column(c1,c2) VALUES('d1','d2'),('dd1','dd2'),('ddd1','ddd2')";// this is the basic sql command $data = array('data1','data2','data3'); $data = '('.implode(', ',$data).')'; $sql = "INSERT INTO table column(c1,c2) VALUES $data"; $data = array(array('1','2','3'),array('4','5','6'),array('7','8','9')); $xa = array(); $a = 0; foreach($data as $dt) { $xa[$a] = '('.implode(',',$dt).')'; ++$a; } $data = '('.implode(',',$xa).')'; $sql = "INSERT INTO table column(c1,c2) VALUES $data"; 
Intereting Posts