다음은 특별히 효율적이지 않지만 작동합니다. 뷰는 "함수 내에서 부작용 연산자 'newid'를 잘못 사용해야합니다." 오류. UDF는 비 결정적이라고 가정되므로 각 행에 대해 항상 다시 평가됩니다.
이렇게하면 SQL Server가 스풀을 계획에 추가하고 이전 결과를 재생하는 데 문제가 발생하지 않습니다.
업데이트 할 행 수가 많은 경우 (또는 집합의 수가 많은 경우)이 메서드를 사용하지 않을 것입니다.
CREATE VIEW dbo.OneNumber
AS
SELECT TOP 1 number
FROM master..spt_values
ORDER BY NEWID()
GO
CREATE FUNCTION dbo.PickNumber()
RETURNS int
AS
BEGIN
RETURN (SELECT number FROM dbo.OneNumber)
END
GO
DECLARE @tableA TABLE (someColumnName INTEGER)
INSERT INTO @tableA VALUES (2), (2), (2), (2), (2)
UPDATE @tableA
SET someColumnName = dbo.PickNumber()
SELECT * FROM @tableA
중복 가능성을 허용 하시겠습니까? 즉 각각의 someColumnName은 tb_Numbers에서 임의의 "pick"을 수행합니까? 또한 인접한 숫자는 완전히 임의적입니다. –
@ Martin Smith : 예, 복제본을 사용할 수 있습니다. – Draco
세트에 몇 개의 번호가 있습니까? 업데이트 할 행 수는 얼마입니까? 숫자 테이블에 일련 번호 열을 추가하여 해당 범위의 난수를 생성하고 'newid()'에 의해 반복적으로 주문할 필요없이 특정 일치하는 행을 검색 할 수 있습니까? –