【问题标题】:while using table valued parameter getting scalar variable error in sp在使用表值参数在 sp 中获取标量变量错误时
【发布时间】:2013-10-21 17:50:20
【问题描述】:

我创建了这样的表值参数:

CREATE TYPE dbo.ss AS TABLE(ss1 NVARCHAR(5));

然后我这样写了我的存储过程:

ALTER PROCEDURE [dbo].[T_TransactionSummary] 
 @locations dbo.ss readonly
as
begin
...............
.............
AND (Location_tbl.Locid IN (@locations))

执行此操作时出现错误:

必须声明标量变量“@locations”。

我的存储过程出了什么问题

【问题讨论】:

  • 我从来没有使用过这些,但是你不需要从那个参数中选择,因为类型是一个 TABLE 结果?
  • 试试:AND (Location_tbl.Locid IN (select ss1 from @locations))
  • 如上所述。您可以通过 JOIN 来实现相同的方法。
  • 是的,我错过了 OP 中的第一行。顺便说一句,我删除评论,因为你已经得到了答案。
  • 为什么是dbo.ss(ss1)?这些根本不是很有用或有意义的名字。为什么NVARCHAR(5) 而不是INT?如果值大于 5 个字符怎么办?为什么它需要是 Unicode?在你的另一个问题中,你说这些是整数,对吧?

标签: sql-server table-valued-parameters


【解决方案1】:

真的吗? I showed you here 您不能使用 IN (@TVP) 而是必须使用不同的技术,例如WHERE EXISTS:

WHERE EXISTS (SELECT 1 FROM @locations WHERE ss1 = Location_tbl.Locid)

你也可以说:

WHERE Location_tbl.Locid IN (SELECT ss1 FROM @locations)

或者:

INNER JOIN @locations AS x
ON x.ss1 = Location_tbl.Locid

原因是@locations 现在本质上是一个表,而不是变量或文字值。你不能说WHERE EmployeeID IN (dbo.Employees),对吧?你说WHERE EmployeeID IN (SELECT EmployeeID FROM dbo.Employees)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    相关资源
    最近更新 更多