2011-04-02 84 views
2

我已经创建了一个TVP,并且我正尝试在存储过程中将它用于存储过程中的输入。 问题是我无法用它创建我的SP。它说无法在Stored Proc中将变量声明为TVP类型

Msg 137, Level 16, State 1, Procedure uspGetUsersPresentCount, Line 14 
Must declare the scalar variable "@usersList". 

我的SP是

IF EXISTS (SELECT * FROM sysobjects WHERE name = 'uspGetUsersPresentCount') 
    BEGIN 
     DROP Procedure [AMProcedures].[uspGetUsersPresentCount] 
    END 

GO 


SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROC [AMProcedures].[uspGetUsersPresentCount] 
(
    @usersList AS [AMProcedures].[udfUserListTVP] READONLY, 
    @startDate DATETIME, 
    @endDate DATETIME 
) 
AS 
BEGIN 
DECLARE @okStatus TINYINT = 4 
SET NOCOUNT ON 

    SELECT MIMO.UserID, COUNT(MIMO.MoveInTime) FROM AMTables.tblUserMoveInMoveOutDetails MIMO 
     JOIN @usersList ON [email protected] 
      WHERE [email protected] AND 
       MIMO.MoveInTime BETWEEN @startDate AND @endDate 
      GROUP BY MIMO.UserID 

SET NOCOUNT OFF 

END 
GO 

谁能告诉我有什么错我是做什么...我已经试过什么,我知道,但似乎没有任何工作。

谢谢先进。

回答

3

要么使用的别名用户列表,或者把它放在方括号:

JOIN @usersList UL ON MIMO.UserID=UL.UserID 

JOIN @usersList ON MIMO.UserID=[@usersList].UserID 
+0

非常感谢它worked..you救了我大量的时间。 – Sumit 2011-04-02 16:59:21

+0

我想知道为什么需要创建一个别名的原因,是因为我使用连接,因为我已经在子查询中使用TVP而不创建别名。 – Sumit 2011-04-02 17:05:40

+0

这个“问题”不是特定于TVPs,而是特定于任何表变量。与普通表一样,如果两个列名称具有意义,他们需要通过表标识符或别名来限定。现在发生的情况是,如果不指定别名,则必须将该名称放入'[]'中,以便解析器不会将其识别为变量名称,而是将其识别为列名限定。 – Lucero 2011-04-02 21:36:23