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

Emi*_*ort 7 php sql-server arrays stored-procedures sql-server-2008-r2

我有这个数组

$REV = Array
(
    0 => 240,
    1 => 241,
    2 => 242,
    3 => 243,
    4 => 249
);
Run Code Online (Sandbox Code Playgroud)

我现在使用此代码插入,将每个数组的元素存储在$ 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);
}
Run Code Online (Sandbox Code Playgroud)

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

$stmt = mssql_init('sp_insertRev');
mssql_bind($stmt, '@ID', $ID, SQLINT4);
mssql_bind($stmt, '@CCType', 'REV', SQLVARCHAR);
Run Code Online (Sandbox Code Playgroud)

该阵列在这里不起作用

mssql_bind($stmt, '@CSID', $val_rev, SQLINT4);//An example 
Run Code Online (Sandbox Code Playgroud)
mssql_bind($stmt, '@IdUSer', $IDUSER, SQLCHAR);
$result = mssql_execute($stmt);
Run Code Online (Sandbox Code Playgroud)

我如何在阵列中使用此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
Run Code Online (Sandbox Code Playgroud)

Rob*_*ert 3

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

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

CREATE PROCEDURE [dbo].[sp_HCCInsert]
(
   @XMLDoc XML
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

有关 OPENXML 的一些有用链接

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