必须使用动态tablename声明标量var ...

时间:2016-09-18 08:46:09

标签: c# sql sql-server

我正在尝试在以下SQL中使用变量tablename,但我一直在

  

必须声明标量变量@Projectnr

从C#程序执行。

这些值是由程序传递的,我确定这是在这个SQL的某个地方混淆了......

这是SQL:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_Insert_ProjectWerktijden]

   @Projectnr               VARCHAR(50),
   @Tasknr                  VARCHAR(50),
   @Datum                   DATETIME,
   @Startuur                DATETIME,
   @Einduur                 DATETIME,
   @WerktijdDEC             float,
   @TijdTijd                DATETIME,
   @Scanner                 VARCHAR(50),
   @StartID                 int,
   @EindID                  int,
   @Functiecode             int,
   @Naam                    varchar(100),
   @table                   NVARCHAR(50)



AS
BEGIN 
  SET NOCOUNT ON 
DECLARE @sql NVARCHAR(MAX)
SET @sql= 'INSERT INTO **TABLE**
  ( 
        Projectnr, 
        Taaknummer,
        Datum,
        Start,
        Einde,
        Tijd,
        TijdTijd,
        Scanner,
        StartID,
        EindID,
        Functiecode,
        Naam
)
VALUES
(
@Projectnr,@Tasknr,@Datum,@Startuur,@Einduur,@WerktijdDEC,@TijdTijd,@Scanner,@StartID,@EindID,@Functiecode,@Naam
)
';
SET @sql = REPLACE(@sql, '**TABLE**', @table);
EXECUTE(@sql);
END

和C#代码

public static void TijdSaven(string projectnr, string tasknr, DateTime datum, DateTime? start, DateTime? einde, double tijd, DateTime tijdtijd,string scanner, int beginid, int eindid,int functiecode,string naam,string table) 
{ 
  if (tasknr.Contains("X")) { tasknr = "n.v.t.";} 
  ctx = new DataClassesDataContext();              
  ctx.sp_Insert_ProjectWerktijden(projectnr, tasknr, datum, start, einde, tijd, tijdtijd, scanner, beginid, eindid,functiecode,naam,table); 
  ctx.SubmitChanges();
}

1 个答案:

答案 0 :(得分:5)

如果在执行之前执行PRINT(@sql),您将看到要运行的查询是:

INSERT INTO **TABLE**
  ( 
        Projectnr, 
        Taaknummer,
        Datum,
        Start,
        Einde,
        Tijd,
        TijdTijd,
        Scanner,
        StartID,
        EindID,
        Functiecode,
        Naam
)
VALUES
(
@Projectnr,@Tasknr,@Datum,@Startuur,@Einduur,@WerktijdDEC,@TijdTijd,@Scanner,@StartID,@EindID,@Functiecode,@Naam
)

在此查询中,您的变量没有声明,这就是您收到错误的原因。

而不是EXECUTE(@sql);更好地使用参数:

DECLARE @ParmDefinition nvarchar(MAX); 

SET @ParmDefinition = N'   
@Projectnr VARCHAR(50),
@Tasknr VARCHAR(50),
@Datum DATETIME,
@Startuur DATETIME,
@Einduur DATETIME,
@WerktijdDEC float,
@TijdTijd DATETIME,
@Scanner VARCHAR(50),
@StartID int,
@EindID int,
@Functiecode int,
@Naam varchar(100)
'; 
--I guess table name must be replaced, you cannot use parameter for that one
SET @sql = REPLACE(@sql, '**TABLE**', QUOTENAME(@table));

EXEC sp_executesql @sql, @ParmDefinition, 
                            @Projectnr = @Projectnr,
                            @Tasknr = @Tasknr,
                            @Datum = @Datum,
                            @Startuur = @Startuur,
                            @Einduur = @Einduur,
                            @WerktijdDEC = @WerktijdDEC,
                            @TijdTijd = @TijdTijd,
                            @Scanner = @Scanner,
                            @StartID = @StartID,
                            @EindID = @EindID,
                            @Functiecode = @Functiecode,
                            @Naam = @Naam

更多信息here