mysql - 如何将变量传递给存储过程的主体语句?

标签 mysql sql stored-procedures

我有一张 table books

+-------+-----------+------------+
| serial| book_name | book_author|
+-------+-----------+------------+
| 1     | Star Wars |     1      |
| 2     | Java      |     2      |
| 3     | Alimals   |     3      |
| 4     | Star Wars |     1      |
+-------+-----------+------------+

我想使用存储过程来选择 book_name;

我的存储过程是这样的:

USE books;
DELIMITER //
CREATE PROCEDURE doselect(col VARCHAR(50), tab VARCHAR(50), cond INT(5))
BEGIN
    SET @x = NULL;
    SET @col = col;
    SET @tab = tab;
    SET @cond = cond;
    SET @x = (SELECT @col FROM @tab WHERE b_id = @cond);

END //
DELIMITER ;

然后我称它为:

CALL doselect('book_name', 'books', 3)

但是 id 不起作用。它看不到变量 @tab。错误是:

Table books.@tab doesn't exists.

我还使用了这种 SELECT 条件的变体:

SET @x = (SELECT 'col' FROM 'tab' WHERE b_id = 'cond');

同样的错误,但现在没有@:

Table books.tab doesn't exists.

在这种情况下如何正确传递变量?如何让它看到我的变量?

谢谢。

最佳答案

使用您的选择和所有变量构建字符串,然后 Exec(string) 运行您的选择。

CREATE PROCEDURE spName
    @Var VARCHAR(50)
AS
  SET NOCOUNT ON;

  DECLARE @sql VARCHAR(8000)

  SET @sql = 'SELECT
      X, Y + '' - '' + Z as ''Some alias''
FROM ' + @Var + '..TableName '

      exec (@sql)
GO

关于mysql - 如何将变量传递给存储过程的主体语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10634919/

相关文章:

php - 从sql中选择前50条记录

mysql - 多个 where 子句与 OR 一起使用,而不与 AND 一起使用

sql - Visual Studio 差异窗口 : How to Edit . sql 文件

c# - 从 EF 6 调用 mysql 存储过程时出现语法错误

标记新值和重复值的 Mysql 代码

php - INSERT 查询不返回对象

MySQL/MariaDB - 按内部子查询排序

sql - 将关联表中的几列与 SQL 连接一起使用

python - 从sql查询中重新组合python中的时间列表

Oracle 通过过程插入或更新行