Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此SQL server查询是否存在语法错误?我能不能不使用;目标。@1";?_Sql_Sql Server_Database - Fatal编程技术网

此SQL server查询是否存在语法错误?我能不能不使用;目标。@1";?

此SQL server查询是否存在语法错误?我能不能不使用;目标。@1";?,sql,sql-server,database,Sql,Sql Server,Database,硬编码,这是有效的: var insertCommand1 = ("MERGE INTO Leaderboard WITH (HOLDLOCK) AS target USING (SELECT * FROM Scores WHERE WeekNumber = 7) AS Source ON (target.id = source.id) WHEN MATCHED THEN UPDATE SET target.Id = source.Id, target.Week7 = source.weekl

硬编码,这是有效的:

var insertCommand1 = ("MERGE INTO Leaderboard WITH (HOLDLOCK) AS target USING (SELECT * FROM Scores WHERE WeekNumber = 7) AS Source ON (target.id = source.id) WHEN MATCHED THEN UPDATE SET target.Id  = source.Id, target.Week7 = source.weeklyScore WHEN NOT MATCHED THEN INSERT (Id, Week7) VALUES (source.Id, source.weeklyScore);");

db.Execute(insertCommand1);
这不起作用:

var insertCommand1 = ("MERGE INTO Leaderboard WITH (HOLDLOCK) AS target USING (SELECT * FROM Scores WHERE WeekNumber = @0) AS Source ON (target.id = source.id) WHEN MATCHED THEN UPDATE SET target.Id  = source.Id, target.@1 = source.weeklyScore WHEN NOT MATCHED THEN INSERT (Id, @2) VALUES (source.Id, source.weeklyScore);");

db.Execute(insertCommand1, weeknum, weekstring, weekstring);
错误表明@1附近有语法错误。这会是什么? 我已经调试过了,以确保weeknum和weekstring的值是正确的

在VS 2015上使用SQL server

两个表的架构-

Leaderboard(Id, Week1, Week2, Week3, Week4, Week5, 
                Week6, Week7, Week8, Week9, Week10) 
with Id as the primary key

Scores(Id, WeekNumber, weeklyScore) 
with Id and WeekNumber as the primary key

您正在尝试使用参数设置字段名,@parameters用于值

 , target.@1 = source.weeklyScore 
应该是

 , target.something = @1

您正在尝试使用参数设置字段名,@parameters用于值

 , target.@1 = source.weeklyScore 
应该是

 , target.something = @1

看起来您正在尝试将参数用作模式对象名,而不是值。正如你所发现的,这是行不通的。参数仅用于值

 , target.@1 = source.weeklyScore 
如果需要动态模式对象名称,请注意两件事:

  • 它可能会对性能产生影响,尽管影响可能不大
  • SQL注入是一个值得关注的问题
  • 第一个你可以衡量的是它是否成为问题,但我怀疑它会成为问题。第二个问题可以通过小心处理。SQL注入的简单规则不是总是对所有内容使用参数,而是永远不要将用户修改的值作为代码执行

    对于模式对象,您已经有了一组有限的可能值。因此,您可以在代码中构建已知值的列表。这不是用户修改的,所以它是安全的。(可能是硬编码的,也可能是从DB模式自动生成的,这取决于您。)

    使用变量,检查它是否与列表中的值匹配。如果没有,那就是一个错误,代码应该只引发相应的异常,或者以其他方式处理该错误。如果它确实匹配安全非用户可修改值的已知有限列表中的元素,请在查询中使用该列表中的匹配值:

    var query = string.Format("SELECT SomeTable.{0} FROM SomeTable ...", knownList[x]);
    
    (或者,不管你想如何组织,希望你能得到这个想法。)


    然后,通过动态生成的查询,您可以添加参数值,一切都已就绪。

    看起来您正在尝试将参数用作模式对象名,而不是值。正如你所发现的,这是行不通的。参数仅用于值

     , target.@1 = source.weeklyScore 
    
    如果需要动态模式对象名称,请注意两件事:

  • 它可能会对性能产生影响,尽管影响可能不大
  • SQL注入是一个值得关注的问题
  • 第一个你可以衡量的是它是否成为问题,但我怀疑它会成为问题。第二个问题可以通过小心处理。SQL注入的简单规则不是总是对所有内容使用参数,而是永远不要将用户修改的值作为代码执行

    对于模式对象,您已经有了一组有限的可能值。因此,您可以在代码中构建已知值的列表。这不是用户修改的,所以它是安全的。(可能是硬编码的,也可能是从DB模式自动生成的,这取决于您。)

    使用变量,检查它是否与列表中的值匹配。如果没有,那就是一个错误,代码应该只引发相应的异常,或者以其他方式处理该错误。如果它确实匹配安全非用户可修改值的已知有限列表中的元素,请在查询中使用该列表中的匹配值:

    var query = string.Format("SELECT SomeTable.{0} FROM SomeTable ...", knownList[x]);
    
    (或者,不管你想如何组织,希望你能得到这个想法。)



    然后,通过动态生成的查询,您可以添加参数值,一切都已就绪。

    您可能问了错误的问题。请向我们展示一些数据和预期的输出,以及您试图实现的目标,我们可以为您提供更多帮助。@JuanCarlosOropeza刚刚发布了架构-希望这有帮助!Jules您的模型外观应该是标准化的,
    排行榜应该是
    {Id,Week\u Id,Score}
    然后如果您想显示几周,您可以使用
    PIVOT
    ,这将允许您在不更改db设计的情况下添加或删除周数。实际上,在查看
    分数之后,您不需要
    排行榜
    表格。只需使用超过
    的分数创建一个视图即可。您可能问了错误的问题。请向我们展示一些数据和预期的输出,以及您试图实现的目标,我们可以为您提供更多帮助。@JuanCarlosOropeza刚刚发布了架构-希望这有帮助!Jules您的模型外观应该是标准化的,
    排行榜应该是
    {Id,Week\u Id,Score}
    然后如果您想显示几周,您可以使用
    PIVOT
    ,这将允许您在不更改db设计的情况下添加或删除周数。实际上,在查看
    分数之后,您不需要
    排行榜
    表格。只需使用over
    分数创建一个视图即可。哦,好的。有什么替代方案?这是一个变化的动态变量,我需要能够改变查询所说的内容。您可以创建一个动态查询。但我还是不确定你在这里想要实现什么。乍一看,您的查询似乎不符合逻辑,因此我们需要db架构示例数据并希望输出能够理解您需要的内容。您必须将字符串构建中的@1替换为您正在检查的字段名称,例如,
    var insertCommand1=(“合并到排行榜,使用(HOLDLOCK)作为目标使用(在匹配时,从WeekNumber=@0的分数中选择*作为源(target.id=Source.id),然后更新SET target.id=Source.id,target.“&fieldNameVar&“=Source.weeklyScore,如果不匹配,则插入(id,@2)值(Source.id,Source.weeklyScore);”);
    但是,您的查询肯定有一些缺陷。为什么要更新ID?为什么来自
    weeklyscore
    的值会出现在不同的字段中?它会出现多少不同的字段名?它们都在一个表中吗?数据看起来像什么?所有这些可能都需要为您提供最佳答案,如而不是简单地回答你所问的问题,而不试图看这是否是达到你想要的结果的最佳方式。@JuanCarlosOropeza我将target.Week7作为目标。@1因为Week7是