SQL 提示必须声明表变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 提示必须声明表变量相关的知识,希望对你有一定的参考价值。

USE [idlist]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ccout]
@lx varchar(10),
@id varchar(30),
@zt varchar(10),
@sjbh varchar(10)
AS
begin
set nocount on
declare @sql nvarchar(500)
declare @int int
if @lx='1'
begin
With T
As
(
Select Top 1 * From @id Where 状态=1 Order by newid() '这里出的错误
)
Update T Set 状态=2
Output inserted.编号,inserted.账号,inserted.密码

end
else
begin
set @sql='update '+@id+' set 状态='+@zt+' where 编号='+@sjbh
exec(@sql)
end
set nocount off
end
对存储过程不太了解,在调试运行存储过程时提示必需声明表变量@id,求大神帮忙

参考技术A Create PROCEDURE [dbo].[ccout]
@lx varchar(10),
@id varchar(30),
@zt varchar(10),
@sjbh varchar(10)
AS
begin
set nocount on
declare @sql nvarchar(500)
declare @int int
if @lx='1'
begin
Set @sql='
With T
As
(
Select Top 1 * From '+@id+' Where 状态=1 Order by newid()
)
Update T Set 状态=2
Output inserted.编号,inserted.账号,inserted.密码 '
end
else
begin
set @sql='update '+@id+' set 状态='+@zt+' where 编号='+@sjbh
end

exec (@sql)
set nocount off
end本回答被提问者采纳
参考技术B 看的出@id是一个内存表,你的语句里面没有定义,或者程序不完整追问

ID是一个参数,传进来的表名,请问这样的要如何定义呢

追答

据我所知参数是不可以用表的,如果要声明也要知道表结构才行

比如
declare @id table (状态 int)

但你的里面已经存在@id的变量了,所以不能再用@id作表名

在 T-SQL 中,如何在子查询中引用表变量?

【中文标题】在 T-SQL 中,如何在子查询中引用表变量?【英文标题】:In T-SQL, how to reference to table variable in the subquery? 【发布时间】:2010-11-23 03:06:30 【问题描述】:

我已经声明了一个表变量“@t”,并正确执行了“INSERT-INTO-SELECT”。 当我试图通过一些额外的计算来查询表变量以进行每组行编号时,我在直接使用“@t”时出现“必须声明变量”或在使用“@t”的别名时出现“无效的对象名称”错误'。请多多指教。

SELECT 
    *,
    (SELECT COUNT(*) FROM "LTV" "COUNTER"
     WHERE 
        "COUNTER"."Collateral_ID" = "LTV"."Collateral_ID"
        AND
        "COUNTER"."m_il_no" = "LTV"."m_il_no"
        AND
        "COUNTER"."Ref_Key" <= "LTV"."Ref_Key"
     GROUP BY "COUNTER"."Collateral_ID", "COUNTER"."m_il_no"
    ) "MIL_IDX"

FROM @t AS LTV

【问题讨论】:

【参考方案1】:

用途:

SELECT x.*,
       y.num
  FROM @t x
  JOIN (SELECT t.collateral_id,
               t.m_il_no,
               COUNT(*) AS num
          FROM @t t
      GROUP BY t.collateral_id, t.m_il_no) y ON y.collateral_id = x.collateral_id
                                            AND y.m_il_no = x.m_il_no

【讨论】:

重点是,我们要在子查询里面声明表变量的别名

以上是关于SQL 提示必须声明表变量的主要内容,如果未能解决你的问题,请参考以下文章

必须声明表变量 "@P0"

SQL Server 事务/并发混乱 - 你必须总是使用表提示吗?

SQL 错误 - 必须声明表变量“@tablename”

从 SQL 函数返回动态透视表的困难 - “必须声明表变量 xxx”

ms sql变量问题:提示参数对象无效!

“必须声明表变量”