SQLserver将Column作为变量并循环遍历它

时间:2015-04-15 20:33:04

标签: sql-server-2008 tsql loops

我仍然是SQL服务器的新手,我不知道如何做到这一点。我首先创建一个只包含我需要的ID的表:

SELECT DISTINCT
ID_NUMBER
INTO
#IDlist
FROM
V_Rpt_IDs WITH (NOLOCK)
WHERE
ID_NUMBER in (
'1000764169'
,'1005870537'
,'1008053856'
,'1008054376'
,'1008410224'
,'1008411317'
,'1008465318'
,'1008466074'
,'1008492967'
,'1010546872'
,'1010554301')

Select * from #IDlist

这很好用。但是现在我想声明一个变量来表示这个列,或者这个列中的每个项目,这样我就可以循环遍历每个ID号并返回每个ID的信息,然后将所有这些表示为表。这是我的镜头:

Declare @IDNumber as VARCHAR(10)
Set @IDNumber = #IDlist.ID_NUMBER

DECLARE @cnt INT = 0

WHILE @cnt < (Select Count(*) From #IDlist)
BEGIN
SELECT TOP 1
NAME
,MAILING_ADDRESS_1
,MAILING_ADDRESS_CITY
,MAILING_STATE
,MAILING_ZIP
from
V_Rpt_Info
WHERE
ID_NUMBER = @IDNumber

SET @cnt = @cnt + 1

END

DROP TABLE #IDlist

但是,当我将@IDNumber变量设置为#IDlist.ID_NUMBER时,它会显示The multi-part identifier "#IDlist.ID_NUMBER" could not be bound.

我该怎么做?

由于

2 个答案:

答案 0 :(得分:1)

设置变量的方式不正确,SQL不知道应该将哪个ID_NUMBER行分配给@IDNumber变量。 您应该使用SELECT执行此操作,例如

SET @IDNumber = SELECT TOP 1 ID_NUMBER FROM #IDlist

但是,为什么要以这种方式遍历此临时表?是不是可以用这个表加入必要的数据而不是逐个加入?

答案 1 :(得分:1)

而不是循环,你将要将你的ID表加入你的V_Rpt_Info视图。

SELECT
    NAME
  , MAILING_ADDRESS_1
  , MAILING_ADDRESS_CITY
  , MAILING_STATE
  , MAILING_ZIP
FROM V_Rpt_Info V
INNER JOIN #IDlist ID
ON V.ID_NUMBER = ID.ID_NUMBER