【问题标题】:How can I use a variable within a stored procedure如何在存储过程中使用变量
【发布时间】:2015-12-23 03:26:47
【问题描述】:

我只是想知道是否可以在存储过程中使用变量。例如:

    CASE    @productType
    WHEN 1 THEN
    DECLARE @table = ‘products1’
    WHEN 2 THEN
    DECLARE @table = ‘products2’
END

SELECT * FROM @table;

显然这不起作用,只是想知道是否有办法做到这一点。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    是的,有办法。可以使用动态sql。

    DECLARE @productType INT = 1
    DECLARE @table  NVARCHAR(MAX)
    DECLARE @sql    NVARCHAR(MAX)
    
    SELECT @table = 
        CASE @productType
            WHEN 1 THEN 'products1'
            WHEN 2 THEN 'products2'
        END
    
    SELECT @sql = 'SELECT * FROM ' + QUOTENAME(@table);
    
    EXEC(@sql)
    

    【讨论】:

      【解决方案2】:

      您可以简单地使用 if else if 语句:

      DECLARE @productType INT = 2
      IF @productType = 1
          SELECT * FROM products1
      ELSE IF @productType = 2
          SELECT * FROM products2
      

      或使用sp_executesql

      DECLARE @productType INT = 1;
      DECLARE @table  NVARCHAR(MAX);
      DECLARE @sql    NVARCHAR(MAX);
      
      
      SELECT @table = 
          CASE @productType
              WHEN 1 THEN 'products1'
              WHEN 2 THEN 'products2'
          END;
      
      SELECT @sql = 'SELECT * FROM ' + QUOTENAME(@table);
      
      EXEC sp_executesql @sql;
      

      【讨论】:

      • 是的,这是一个简单的例子,但我想在更复杂的过程中使用它,因为使用这种方法会很笨拙
      • 您能否解释一下您的场景,很多时候最好避免使用动态 SQL
      • 我明白了,这是出于性能原因吗?这种情况基本上是因为我有一个很长的语句,必须在整个过程中更改表名。有很多场景,所以我必须有 20 多个 if 语句并复制粘贴很多代码
      • 不,这是出于安全原因,在您的情况下,您应该使用 EXEC sp_executesql @sql 而不是 EXEC (@sql)。 stackoverflow.com/questions/548090/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2015-12-10
      • 2013-07-16
      相关资源
      最近更新 更多