Я хочу создать динамическую c SQL в хранимой процедуре, которая принимает имя таблицы в качестве параметра, и для каждого столбца в этой таблице значения будут обновляться случайным значением из того же столбца.
( Мне это нужно для создания таблиц в целях тестирования, чтобы я не использовал реальные данные ).
Например, допустим, у меня есть таблица «студентов» ниже:
|ID| FName| BirthDay |
-----------------------
|1 | Mike | 1993-07-24|
-----------------------
|2 | John | 1995-10-11|
-----------------------
|3 | Bob | 1992-04-13|
-----------------------
После обновления значения будут обновляться случайным образом, используя те же значения из таблицы:
|ID| FName| BirthDay |
-----------------------
|2 | Bob | 1995-10-11|
-----------------------
|3 | John | 1995-10-11|
-----------------------
|3 | Mike | 1992-04-13|
-----------------------
Для случайного значения я пробовал что-то вроде этого:
UPDATE students
SET ID = SELECT TOP 1 ID FROM students ORDER BY NEWID()
SET FName = SELECT TOP 1 FName FROM students ORDER BY NEWID()
SET Birthday = SELECT TOP 1 Birthday FROM students ORDER BY NEWID()
Есть ли у вас какие-либо идеи, как реализовать это как хранимую процедуру (SQL Сервер), чтобы я мог использовать его с любой таблицей, заданной как параметр?
Позднее редактирование : я уже сделал это (он принимает имя таблицы в качестве параметра и обновляет каждый столбец, найденный в этой таблице, но проблема в том, что после обновления все значения в столбце одинаковые).
Вот код:
CREATE PROCEDURE [dbo].[RandomUpdate]
@TableName NVARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sql NVARCHAR(MAX) = (
SELECT ' UPDATE ' + @TableName--note the extra space at the beginning
+ ' SET ' + QUOTENAME(c.name) + ' = ' + '(SELECT TOP 1 ' + QUOTENAME(c.name) + ' FROM ' + @TableName + ' ORDER BY NEWID());'
FROM sys.columns c
WHERE c.object_id = OBJECT_ID(@TableName)
FOR XML PATH('')
)
PRINT @sql;
EXEC sp_executesql @sql
END
и вывод выглядит так:
|ID| FName| BirthDay |
-----------------------
|3 | Bob | 1995-10-11|
-----------------------
|3 | Bob | 1995-10-11|
-----------------------
|3 | Bob | 1995-10-11|
-----------------------
Есть идеи, как установить разные значения?