考虑以下从表变量中获取随机行的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;
由于某种原因,最后一个SELECT
语句有时会返回0行,有时会返回1,2或3行。
对我来说没有意义。该列的值是唯一的,ABS(CHECKSUM(NEWID())) % @priceClassesCount
不能是多值的,可以吗?
当我声明RowIndex INT NOT NULL PRIMARY KEY
而不是RowIndex INT
时,问题就会消失。有什么想法吗?
答案 0 :(得分: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;
希望RowIndex
没有空白。这可能是你没有获得任何行的另一个原因。
答案 1 :(得分:4)
要获得一个随机行,您可以执行此操作
SELECT TOP 1
PriceClasses.RowIndex,
PriceClasses.PriceClassID
FROM
@priceClasses AS PriceClasses
ORDER BY
NEWID();
虽然@GordonLinoff是正确的,但该要求有一个更简单的解决方案