如何使用存储过程SQL SERVER 2008 R2(mssql)插入PHP数组值


How to insert PHP array values using an stored procedure SQL SERVER 2008 R2(mssql)

我有这个数组

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

我现在使用下面的代码插入,将每个数组的元素与$id、$userID、Type和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);
}

但我想要的是可以使用这个存储过程,但我不知道如何使用sp:一次插入

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

阵列在此不起作用

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

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

如何将此SP与阵列一起使用

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

我在这篇文章中找到了解决您问题的方法

这一切都是关于将数组作为XML字符串传递给过程,并在过程中使用OPENXML函数的INSERT SELECT语句。

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

然后使用MSSQL中的函数OPENXML。你应该阅读这个主题。所以伪代码看起来像

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

在您阅读并满足您的需求后,只需将XML传递给过程即可。

关于OPENXML 的一些有用链接

  • http://msdn.microsoft.com/pl-pl/library/ms175160.aspx
  • 在SQLServer2008存储过程中使用OPENXML-INSERT顺序与XML文档不同
  • http://www.informit.com/articles/article.aspx?p=26499

此外,我建议使用PDO,因为它有更好的抽象层。我希望它能帮助你。

我倾向于使用PDO而不是mssql_*函数,您仍然可以使用dblib,并且可以非常简单地绑定该数组。不过,有一点是,该数组中有5个元素,但存储过程中只有4个输入变量。本例假设您的数组中只有4个元素。

$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

在PHP 5.3或更早版本上使用带有dblib的PDO时,唯一需要注意的是,它会在执行时进行预取。因此,如果您执行一个巨大的查询,并且希望一次循环遍历每个记录。。。对不起,你先缓冲一下。

此外,如果你想要,你可以使用关联数组

$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

最棒的部分是,PDO::语句的执行方法转义字符串!安全第一,你知道。

$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";