【问题标题】:How to insert PHP array values using an stored procedure SQL SERVER 2008 R2(mssql)如何使用存储过程 SQL SERVER 2008 R2(mssql) 插入 PHP 数组值
【发布时间】:2013-06-26 21:13:43
【问题描述】:

我有这个数组

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

我现在使用下面的代码插入,将每个数组的元素存储在一行中,其中包含 $id、$userID、类型和日期

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

【问题讨论】:

  • 在考虑如何将逗号分隔的值列表存储到单个列中之前,您应该考虑对数据进行规范化。 RDBMS 中的一个单元格通常代表一个原子值,而不是一组值。
  • 你好@ZombieHunter,数据库已标准化,上面我为数组的每个元素插入 4 列,数据库不在我的控制范围内,我无法改变......我想要的是利用sp,在这种情况下,数组只有 5 个元素,但在通常的生产环境中,它可以有 3 或 400 个元素..感谢任何建议或建议

标签: php sql-server arrays stored-procedures sql-server-2008-r2


【解决方案1】:

我在this post找到了解决您问题的方法

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

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

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

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

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

一些关于 OPENXML 的有用链接

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

【讨论】:

  • 嗨,罗伯特,你对 PHP 中的 PDO MSSQL 有很好的经验吗,我正在阅读手册,但它仍处于实验阶段?
  • 你有什么问题? :) 由于 PDO 的抽象层,这很容易。您无需担心 msssql 的内部机制。
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    $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";
    

    【讨论】:

    • 感谢您的回答...但这并不能回答我的问题,就像我所拥有的那样,我想要的是使用存储过程插入数组,请在开头阅读数组下面的代码问题
    猜你喜欢
    • 2015-01-26
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多