从AdventureWorks2019的[Person].[Address]取随机数据报@City未声明错误求解
错误原因
@City是表变量,属于表结构存储多行数据,不能像普通标量变量一样直接在WHERE条件中引用@City.City/@City.ID字段,必须通过查询/关联操作才能读取表变量内的具体行数据。你当前代码中直接引用表变量的字段,SQL会误认为你未声明名为@City的标量变量,因此抛出声明错误。- 原有循环仅通过
@ID计数,没有关联取出对应ID行的城市名,即使没有语法错误也无法正确筛选对应城市的数据。
修正方案
提供两种实现方式,均可满足需求:
方案1:保留原有循环逻辑修正
DECLARE @City TABLE ( ID int IDENTITY , City nvarchar(50) ) INSERT INTO @City (CITY) VALUES ('Snohomish'), ('Duvall'), ('Seattle') -- 用于筛选随机数据集的城市 DECLARE @ID int = 1 DECLARE @CurrentCity nvarchar(50) -- 新增标量变量存储当前循环对应的城市名 CREATE TABLE [Person].randomtest (City nvarchar(50)) WHILE (@ID <= (SELECT count(*) from @City)) BEGIN -- 读取当前ID对应的城市名存入标量变量 SELECT @CurrentCity = City FROM @City WHERE ID = @ID INSERT into [Person].randomtest (City) SELECT TOP 2 [City] FROM [Person].[Address] WHERE CITY = @CurrentCity ORDER BY NEWID() SET @ID = (@ID + 1) END
方案2:无循环高效实现(推荐)
使用CROSS APPLY关联查询,无需循环,代码更简洁、数据量大时性能更优:
DECLARE @City TABLE ( City nvarchar(50) ) INSERT INTO @City (CITY) VALUES ('Snohomish'), ('Duvall'), ('Seattle') CREATE TABLE [Person].randomtest (City nvarchar(50)) INSERT INTO [Person].randomtest (City) SELECT t.City FROM @City c CROSS APPLY ( SELECT TOP 2 a.City FROM [Person].[Address] a WHERE a.City = c.City ORDER BY NEWID() ) t
内容的提问来源于stack exchange,提问作者MisterXAGE_
相关产品推荐
相关产品推荐

