Если вам действительно нужна случайная выборка отдельных строк, измените свой запрос, чтобы отфильтровать строки случайным образом, вместо использования TABLESAMPLE. Например, следующий запрос использует функцию NEWID для возврата примерно одного процента строк таблицы Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
Столбец SalesOrderID включен в выражение CHECKSUM, так что NEWID () выполняет оценку один раз для каждой строки для достижения выборки для каждой строки. Выражение CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) оценивается как случайное значение с плавающей запятой от 0 до 1. "
Источник: http://technet.microsoft.com/en-us/library/ms189108(v=sql.105).aspx
Это дополнительно объясняется ниже:
Как это работает? Давайте выделим предложение WHERE и объясним его.
Функция КОНТРОЛЬНАЯ СУММА вычисляет контрольную сумму по элементам в списке. Спорный вопрос о том, требуется ли вообще SalesOrderID, поскольку NEWID () - это функция, возвращающая новый случайный GUID, поэтому умножение случайного числа на константу в любом случае должно приводить к случайному результату. Действительно, исключение SalesOrderID, похоже, не имеет значения. Если вы увлеченный статистик и можете оправдать включение этого, пожалуйста, используйте раздел комментариев ниже и дайте мне знать, почему я ошибаюсь!
Функция КОНТРОЛЬНАЯ СУММА возвращает ПЕРЕМЕННУЮ. Выполнение побитовой операции И с 0x7fffffff, что эквивалентно (111111111 ...) в двоичном формате, дает десятичное значение, которое фактически является представлением случайной строки из нулей и единиц. Деление на коэффициент 0x7fffffff эффективно нормализует это десятичное число до числа от 0 до 1. Затем, чтобы решить, заслуживает ли каждая строка включения в окончательный набор результатов, используется порог 1 / x (в данном случае 0,01), где x - процент данных, извлекаемых в качестве выборки.
Источник: https://www.mssqltips.com/sqlservertip/3157/different-ways-to-get-random-data-for-sql-server-data-sampling