如何在存储过程的IF语句中从变量(表)中选择*

Posted

技术标签:

【中文标题】如何在存储过程的IF语句中从变量(表)中选择*【英文标题】:How to select * from variable(Table) in IF statement in Stored Procedure 【发布时间】:2021-07-01 09:54:23 【问题描述】:

我正在尝试从 IF 语句中可变的表中进行选择。这是我的问题。

--ItemProcedure (stored procedure name)
--Item (table name)
Itemcode ItemName    qty
--------------------------
item123  Monitor     100
item456  Laptop      50
item789  Keyboard    10
Exec ItemProcedure 'Item'
Declare @Msg as varchar(50)

IF Exists (Select * from @TableName where Itemcode = 'item123')
BEGIN
    SET @Msg = 'Item exists'
END

ELSE

BEGIN
    SET @Msg = 'Item not exists'
END

Select @Msg

有什么方法可以做到这一点吗?请指教。

【问题讨论】:

SELECT * FROM [table] 只是一个例子吗?因为将其作为存储过程在表现力或安全性方面没有任何增加;客户也可以自己提交该声明。这类事情需要动态 SQL,这在数据库端使用起来很不方便。 @jarlh 我正在使用 SQL Server。 对不起,你的问题没有意义。您正在运行的实际代码是什么,您遇到的错误/问题是什么?要“从存储过程中的变量表中选择 *”,您完全按照您所写的:Select * from @TableName 您是否试图将存储过程输出捕获到表变量中?这是一个常见的问题。 哦。你不能那样做。您需要使用动态 SQL ***.com/questions/2838490/a-table-name-as-a-variable 这能回答你的问题吗? A table name as a variable 【参考方案1】:

如果您有两个表,ItemsA 和 ItemsB,您可以创建一个组合它们的视图:

CREATE VIEW vw_ItemsAll
AS
    SELECT ItemCode, ItemName, Qty, 'ItemsA' as TblName FROM ItemsA
    UNION ALL
    SELECT ItemCode, ItemName, Qty, 'ItemsB' as TblName FROM ItemsB
GO

SELECT ItemCode, ItemName, Qty
FROM vw_ItemsAll
WHERE TblName = @TableName

我已经这样做了,它似乎工作得很好。

【讨论】:

以上是关于如何在存储过程的IF语句中从变量(表)中选择*的主要内容,如果未能解决你的问题,请参考以下文章

我可以在存储过程中使用 if 语句将值插入到表中吗?

如何将存储过程的结果返回到用于插入记录的选择语句

TSQL 何时为存储过程中的变量(和表变量)分配内存

如何将选择结果分配给变量?

SQL Server2008 存储过程传入表名称和列名称,如何在语句中使用表明引用列名?

跳出查询以在存储过程中从单独的表中获取 where 子句