【问题标题】:How to declare Array variable in SQL Server?如何在 SQL Server 中声明数组变量?
【发布时间】:2017-01-16 08:07:12
【问题描述】:

我想在存储过程中执行一个查询,它应该循环所有数组值。

例如:

declare arrayStoreID={1001,2400,2001,5000}

for(int i=0;i<arrayStoreID.length;i++)
{
    select 
        col_name1,col_name2
    into
        @temp_table
    from
        Table_Name
    Where 
        storeID=arrayStoreID[i]
}

我想像上面那样表演。 谢谢

【问题讨论】:

  • SQL Server 不支持数组
  • 我认为您可以在这里使用简单的“IN”来代替循环,“... FROM Table_Name WHERE storeID IN (1001,2400,2001,5000)”
  • @a_horse_with_no_name 还有其他办法吗?
  • @AbdulRasheed 不,我的实际情况并非如此。

标签: sql sql-server stored-procedures


【解决方案1】:

temporary table 中的第一家商店 ID 如下

create table #Table_Name(storeID INT, col_name1 varchar(50), col_name2 varchar(50))
insert into #Table_Name values
(1001, 'Test1', 'Test2'),
(5000, 'Rest1', 'Rest2'),
(1122, 'Best1', 'Best2')

然后您可以加入要从中获取记录的表,如下所示, 如果您的要求不是真正的more complicated,这种方法比通过loop 要好得多

select t.col_name1,
    t.col_name2
INTO #new_table
from #Table_Name t
inner join #tmp_ids ti on ti.id = t.storeID

它将返回与IDs匹配并插入到 #new_table以上

select * from #new_table

OUTPUT:
col_name1   col_name2
Test1       Test2
Rest1       Rest2

Note: you can use `table variable` as well

【讨论】:

    【解决方案2】:

    Array 对象在 Sql Server 中不存在。

    你可以创建一个临时表,如下

    CREATE TABLE #mytemp (<list of field>)
    

    您可以在哪里存储您的信息。

    您可以执行 JOIN 操作以将其与其他表一起使用,或者如果您想创建一个循环,您可以定义一个 CURSOR 来处理临时表的每一行

    【讨论】:

    • 没有兄弟。我的情况不同。 link。这个链接呢?
    • @mohamedfaisal:亲爱的,在您的链接中,使用临时表模拟了一个数组创建(解决方案 1)。如果您在问题中添加您的目标,我可以帮助您编写解决方案
    【解决方案3】:

    使用IN 子句。

    您不需要循环或临时表来传递storeID。在IN 子句中传递storeID's 的列表

     select 
            col_name1,col_name2
        into
            #temp_table -- cannot use @table here
        from
            Table_Name
        Where 
            storeID in (1001,2400,2001,5000)
    

    【讨论】:

      【解决方案4】:

      您可以使用cursor 属性

      declare @col_name1 type,@col_name2 type
      declare crsr cursor for select  col_name1,col_name2 from Table_Name Where storeID in (1001,2400,2001,5000)
      open crsr
      fetch next from crsr into @col_name1,@col_name2 
      while @@fetch_status=0
      begin
          insert into @temp_table(col_name1,col_name2) values (@col_name1,@col_name2)
      end
      close crsr
      deallocate crsr
      

      【讨论】:

        猜你喜欢
        • 2012-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多