【问题标题】:Using a variable to represent multiple values使用一个变量来表示多个值
【发布时间】:2013-03-28 20:30:11
【问题描述】:

我有以下查询部分:

Where id in (1,2,3) And country in('France','Italy','Spain')

我想声明 2 个变量并这样做:

Where id in (idsVaraible) And country in(countriesVriable)

这更像是在sql代码中替换sql代码,让我的长查询可读性更强,有什么办法吗?

我认为它更像是 java 脚本中的 eval。

【问题讨论】:

  • 添加一个临时表变量并赋值怎么样?
  • @tech 就是这样,谢谢!

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

如果您需要将这些集合作为字符串传递,一种方法是动态 SQL:

DECLARE @ids VARCHAR(32) = '1,2,3';
DECLARE @countries VARCHAR(2000) = 'France,Italy,Spain';

DECLARE @sql NVARCHAR(MAX) = N'SELECT ... FROM ...
  WHERE id IN (' + @ids + ') AND country IN ('''
  + REPLACE(@countries, ',',''',''') + ''');';

PRINT @sql;
-- EXEC sp_executesql @sql;

另一种方法是表值参数。首先在您的数据库中创建这些类型:

CREATE TYPE dbo.TVPids AS TABLE(ID INT);
CREATE TYPE dbo.TVPcountries AS TABLE(Country VARCHAR(255));

现在您的存储过程可以将这些类型作为输入:

CREATE PROCEDURE dbo.whatever
  @i dbo.TVPids READONLY,
  @c dbo.TVPcountries READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT ... FROM dbo.yourtable AS t
    INNER JOIN @i AS i ON i.ID = t.ID
    INNER JOIN @c AS c ON c.country = t.country;
END
GO

现在,您的应用可以将这两个参数作为集合传递(例如,来自 DataTable),而不是构建逗号分隔的字符串或处理多个参数。

【讨论】:

  • 第一部分就是我想要的:)
  • @user1590636 很好,但您也应该了解第二部分。集合比 JSON 字符串和动态 SQL 更加强大和灵活。
  • @user1590636 当然可以。是什么让您认为逗号分隔的字符串有效而集合无效?您能否提供一个您认为这将是一个问题的示例(最好作为一个不同的问题)?
  • 当然,我的想法是我有一个 group by 子句,按月周 querter 和 year 分组,还按不同的动态列数,你认为使用集合会是一个更好的选择吗?
  • @user1590636 信息不足,无法回答您的问题,抱歉。
【解决方案2】:

请尝试使用临时表变量:

DECLARE @tblID as TABLE(ID INT)
DECLARE @tblCountry as TABLE(Country NVARCHAR(50))

INSERT INTO @tblID VALUES (1),(2),(3)
INSERT INTO @tblCountry VALUES ('France'),('Italy'),('Spain')

WHERE id in (select ID from @tblID) And country in(select Country from @tblCountry)

【讨论】:

    猜你喜欢
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多