Php sql server中的存储过程中是否可以用变量代替列名?
我有一些执行存储过程的php代码,但是在执行php时会抛出错误。我试图弄清楚如何使用变量@col作为我要更新的列,并将该列的值设置为@valPhp sql server中的存储过程中是否可以用变量代替列名?,php,sql-server,Php,Sql Server,我有一些执行存储过程的php代码,但是在执行php时会抛出错误。我试图弄清楚如何使用变量@col作为我要更新的列,并将该列的值设置为@val USE [***_Database] GO /****** Object: StoredProcedure [dbo].[InsertfromPHP] Script Date: 11/11/2015 13:58:00 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO Alter PR
USE [***_Database]
GO
/****** Object: StoredProcedure [dbo].[InsertfromPHP] Script Date: 11/11/2015 13:58:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Alter PROCEDURE [dbo].[UpdatefromPHP]
-- Add the parameters for the stored procedure here
@Col varchar(25),
@Val varchar(25),
@DelvNumber varchar(25)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Declare @sqlText nvarchar(max)
set @sqlText = N'Update NWDeliverables
Set ' + @Col + '= ' + @Val + 'where DelvNumber= ' + @DelvNumber;
EXEC sp_executesql @sqlText;
END
<?php
include_once 'DbConnect.php';
global $connect;
global $record3;
global $emptyQ;
global $rightOn;
global $SqlArr;
$rightOn="Thank you, your time has been inserted successfully";
$SqlArr = $_POST['SqlArr'];
for ($i=0;$i<sizeof($SqlArr);$i++) {
$Empid = $SqlArr[$i][0];
$WkEnd = $SqlArr[$i][1] ;
$Day = $SqlArr[$i][2] ;
$Title = $SqlArr[$i][3] ;
$Description = $SqlArr[$i][4] ;
$Value = $SqlArr[$i][5] ;
$AbbrevJob = $SqlArr[$i][6] ;
$tsql_callSP = "Execute InsertfromPHP ?,?,?,?,?,?,?";
$stmt3 = odbc_prepare($connect, $tsql_callSP);
if($stmt3 === false)
{
throw new ErrorException(odbc_errormsg());
}
$lego = odbc_execute($stmt3,array($Empid,$WkEnd,$Day,$Title,$Description,$Value,$AbbrevJob));
if($lego === false)
{
throw new ErrorException(odbc_errormsg());
}
}
odbc_close($connect);
?>
作为Sql Server的新手,这意味着什么?如何使其成为有效的标识符EDIT:我检查了一下,发现@sqlQuery周围缺少括号。将它们放入,有效标识符错误消失,但现在收到的错误是@Col是无效列,令人惊讶的是,错误使用@Val中的值来给出错误。
“无效列名”AliA“尝试在动态SQL语句中使用QUOTENAME(@Col)(而不仅仅是@Col)
编辑
试试这个:
SET @sqlText = 'UPDATE NWDeliverables
SET ' + QUOTENAME(@Col) + ' = ''' + @Val + '''
FROM NWDeliverables
WHERE DelvNumber = ''' + @DelvNumber + ''''
如果存储过程单独运行,您是否测试过它?实际上我没有。我所做的测试是,如果我准备好的语句和我的php被执行到另一个项目中,我正在做类似的事情,而没有变量作为列名。它是有效的,但这不是执行。我来试试。我试了你想用的方法,但没有用。就好像存储过程从不激发一样。因此,我对如何实现这一目标感到困惑。我正在为另一个应用程序使用相同的方法,而不使用动态列名,并使用准备好的语句来执行存储过程,从而出色地完成了我为其开发的任务。但在这里,它甚至无法启动,我假设这是因为@col变量。
declare @Col nvarchar(25)
declare @Val nvarchar(25)
declare @delvNumber nvarchar(25)
set @DelvNumber = '501310-09'
set @Val = 'AliA'
set @Col = 'Wireman1'
Declare @sqlText nvarchar(max)
set @sqlText = N'Update NWDeliverables
Set ' + QUOTENAME(@Col) + ' = ' + @Val + ' where DelvNumber = ' + @DelvNumber
EXEC @sqlText;
Error recieved:
Msg 203, Level 16, State 2, Line 10
The name 'Update NWDeliverables
Set [Wireman1] = AliA where DelvNumber = 501310-09' is not a valid identifier.
SET @sqlText = 'UPDATE NWDeliverables
SET ' + QUOTENAME(@Col) + ' = ''' + @Val + '''
FROM NWDeliverables
WHERE DelvNumber = ''' + @DelvNumber + ''''