随机的T-SQL返回多行,其中一行是预期的

wh1*_*t1k 1 sql t-sql database sql-server random

请考虑以下从表变量中获取随机行的T-SQL代码(MS SQL Server 2014):

DECLARE @priceClasses TABLE (
    RowIndex INT,
    PriceClassID NVARCHAR(MAX))
;

INSERT INTO @priceClasses VALUES
    (0, 'RETAIL')
    ,(1, 'WHOLESALE')
    ,(2, 'WHOLESALE2')
;

DECLARE @priceClassesCount AS INT;
SET @priceClassesCount = (SELECT COUNT(*) FROM @priceClasses);

SELECT 
    PriceClasses.RowIndex,
    PriceClasses.PriceClassID 
FROM
    @priceClasses AS PriceClasses
WHERE
    PriceClasses.RowIndex = ABS(CHECKSUM(NEWID())) % @priceClassesCount;
Run Code Online (Sandbox Code Playgroud)

由于SELECT某种原因,最后一个语句有时会返回0行,有时会返回1,2或3行.

这对我来说没有意义.列的值是唯一的,ABS(CHECKSUM(NEWID())) % @priceClassesCount不能是多值的,可以吗?

当我宣布RowIndex INT NOT NULL PRIMARY KEY而不是公正时,问题就消失了RowIndex INT.有什么想法吗?

Gor*_*off 6

WHERE行每行评估一次.那是美的NEWID().悲惨的美丽为您的情况.

如果您打算使用此方法,您可以将值存储在变量中:

DECLARE @priceClassesCount AS INT;
SET @priceClassesCount = (SELECT COUNT(*) FROM @priceClasses);
SET @RowIndex = 1 + (ABS(CHECKSUM(NEWID())) % @priceClassesCount)

SELECT pc.RowIndex, pc.PriceClassID 
FROM @priceClasses pc
WHERE pc.RowIndex = @RowIndex;
Run Code Online (Sandbox Code Playgroud)

希望,RowIndex它没有任何差距.这可能是你没有获得任何行的另一个原因.