【问题标题】:DataSet returns error "Must declare the scalar variable ..."DataSet 返回错误“必须声明标量变量...”
【发布时间】:2012-01-28 01:02:50
【问题描述】:

我正在尝试向我的数据集添加查询并收到错误“必须声明标量变量@searchstr”。我觉得这有点奇怪,因为我之前使用 @variable 传递参数没有问题,但无论出于何种原因,它在这里都失败了。

select DISTINCT g.groupname, 
CASE WHEN s.siteguid = @searchstr THEN 1 ELSE 0 END AS doesitexist
from groups g left outer join sitegroups as sg on g.groupguid = sg.groupguid 
left outer join sites as s on sg.siteguid = s.siteguid

发现它在 LINQPad 中也失败了,所以添加更多信息,但遗憾的是这在 DataSet 中仍然不起作用。 :-( 以下适用于 LINQPad 和 SQL Server Management Studio。

declare @searchstr nvarchar(64);
set @searchstr = '21EC2020-3AEA-1069-A2DD-08002B30309D';
select DISTINCT g.groupname, 
CASE WHEN s.siteguid = @searchstr THEN 1 ELSE 0 END AS doesitexist
from groups g left outer join sitegroups as sg on g.groupguid = sg.groupguid 
left outer join sites as s on sg.siteguid = s.siteguid

我做错了什么让我绊倒?怀疑什么时候绊倒我?

【问题讨论】:

  • 我不知道为什么它会给你你提到的错误,但我很好奇你为什么将@searchstr 声明为nvarchar(64)siteguid 是否没有输入为 uniqueidentifier
  • 哦,我只是将一些代码放在一起,看看我的 SQL 在哪里有效。似乎工作正常,我希望将它添加到我的 DataSet 中,但是你不能在 DataSet 查询中使用 DECLARE 或 SET
  • 我放弃并重写了查询,没有使用 CASE 或 WHEN 语句。

标签: sql sql-server dataset


【解决方案1】:

我建议尝试这个来强制解析器获取参数

select DISTINCT g.groupname, 
CASE WHEN s.siteguid = @searchstr THEN 1 ELSE 0 END AS doesitexist
from groups g left outer join sitegroups as sg on g.groupguid = sg.groupguid 
left outer join sites as s on sg.siteguid = s.siteguid
WHERE (@searchstr = '' OR 1 = 1)

【讨论】:

    【解决方案2】:

    可能不是在sql中不正确,而是在另一个位置(参数定义等)?

    【讨论】:

    • 我注意到上面的例子@searchstr 应该作为参数出现在DataSet 上,但它没有。但是,当我添加 WHERE 条件时,会创建一个参数。
    【解决方案3】:

    您可能会感到困惑,因为您没有在 WHERE 语句中使用参数。乍一看,这看起来不像是您应该在 SQL Server 上做的事情,因为它不会影响返回的特定行。

    能否提供更多信息,说明您真正希望使用此 SQL 实现什么?

    【讨论】:

    • 它根据条目是否存在返回第一列和第二列的 BOOL 值(0 或 1)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多