【问题标题】:Declared varchar in where condition在 where 条件下声明 varchar
【发布时间】:2018-08-02 07:41:30
【问题描述】:

我想将声明的变量传递到哪里。

例如我有一张桌子#test:

ID Amount
1  100
2  50
3  20
4  40 
5  150

我想做这样的事情:

declare @id varchar(11) = '(1, 4, 5)'
select * from #test where IDNumber  in @id

我该怎么做?

【问题讨论】:

  • 逗号分隔的项目和 SQL 不能很好地结合在一起。您使用的是哪个 dbms?
  • 使用数据类型设计来存储多个值(表值参数/变量、XML、JSON),而不是把东西塞进字符串然后面对头疼,因为如果您希望 SQL 将它们视为多个值,则需要将它们分开。

标签: sql where declare


【解决方案1】:

创建一个表值用户定义函数,如下所示。网上有很多例子。

Convert comma separated list to Table valued function

这将为您提供比动态 sql 代码更好的结果和更好的方法。

一旦你拥有dbo.split(@string NVARCHAR(4000),',') 函数,然后在下面给出的 JOIN 中使用它们。

declare @id varchar(11) = '1, 4, 5'
select t.* from #test as t
JOIN dbo.Split(@id,',') AS csv
ON t.id = csv.data;

【讨论】:

    【解决方案2】:

    尝试以下方法-:

            declare @id varchar(11) = '(1, 4)'
            declare @sql nvarchar(max)
            set @sql='select * from TABLE_NAME where id  in '+ @id
            EXEC sp_sqlexec @sql
    

    SQL Server 2014

    【讨论】:

      【解决方案3】:

      如 cmets 中所述,您最好使用其他数据类型。

      但如果你真的想像你的例子那样做,你可以使用动态 sql:

      DECLARE @ids VARCHAR(32) = '1,4,5';
      DECLARE @result TABLE (ID INT, Amount INT);
      
      DECLARE @sql NVARCHAR(MAX) = 
      N'  SELECT ID, Amount
          FROM #test
          WHERE ID IN (' + @ids + ');';
      
      PRINT @sql;
      
      INSERT @result
      EXEC(@sql);
      
      SELECT*
      FROM @result;
      

      如果您需要在脚本中再次使用结果,则将结果放入表变量中,如果不需要,您可以 EXEC sql

      【讨论】:

        猜你喜欢
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-18
        相关资源
        最近更新 更多