Dynami c SQL для обновления таблицы случайными значениями из той же таблицы - PullRequest
1 голос
/ 13 января 2020

Я хочу создать динамическую 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|
-----------------------

Есть идеи, как установить разные значения?

1 Ответ

0 голосов
/ 13 января 2020

Просто добавьте следующее в начало вашего SQL оператора CREATE PROCEDURE [nameofprocedure] AS

...