7

我有这个数组

$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
4

3 回答 3

3

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

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

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

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

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

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

一些关于 OPENXML 的有用链接

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

于 2013-07-05T09:40:08.807 回答
1

我倾向于使用 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::Statement 的执行方法转义了字符串!安全第一你懂的。

于 2013-07-03T23:03:07.200 回答
0
$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";
于 2013-07-02T18:02:04.570 回答