You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:21:00