T-SQL: создайте хранимую процедуру для обновления столбца в таблице с таблицей и полем в качестве параметров в - PullRequest
0 голосов
/ 23 января 2019

Я хочу очистить некоторые столбцы в таблице массивной базы данных случайными данными.Я создал хранимую процедуру CreateRandomString для создания случайных данных (для замены имен клиентов и т. Д., Чтобы мы могли использовать эти данные в качестве демонстрации).Теперь я хочу создать хранимую процедуру, которая будет принимать имя таблицы и имя столбца и заменять все данные в этом столбце случайными значениями (каждый столбец имеет другое случайное значение).

Я сделал MySQL иOracle в прошлом, но сейчас я работаю в SQL Server, и я застрял с обновлением и т. Д. Я не буду знать ключ и т. Д. В таблице, поскольку это передается в качестве параметра.

Что ядо сих пор:

CREATE OR ALTER PROC SanitiseData
    (@DataColumnName NVARCHAR(MAX),
     @DataTableName NVARCHAR(MAX))
AS
BEGIN
    DECLARE @RandomString NVARCHAR(MAX)

    ;WITH r AS
    (
         EXEC('SELECT ' + @DataColumnName + ', rn = ROW_NUMBER() OVER (ORDER BY ' + @DataColumnName + ') - 1
               FROM ' + @DataTableName)
    )

И чтобы получить случайную строку, я просто делаю:

EXEC CreateRandomString @RandomString = @RandomString OUTPUT

Однако я не могу использовать EXEC там, так как я могу использоватьпеременные для имен таблиц и полей, а затем, как я могу просмотреть и обновить каждую строку с другим значением?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Это должно сделать то, что вы ищете. Использование уникальных идентификаторов для разбрызгивания ваших данных на бессмысленные значения, хотя вы можете изменить их по своему усмотрению.

CREATE OR ALTER PROC SanitiseData
        (@DataColumnName NVARCHAR(MAX),
         @DataTableName NVARCHAR(MAX))
    AS
    BEGIN
        DECLARE @sql nvarchar(1024) = 'UPDATE ' + @DataTableName + ' SET ' +  @DataColumnName + ' = CAST(NEWID() as varchar(36))';
        EXEC sp_executesql @sql
    END;
0 голосов
/ 23 января 2019

Привет, я думаю, что этот запрос может работать:

CREATE OR ALTER PROC SanitiseData
    (@DataColumnName NVARCHAR(MAX),
     @DataTableName NVARCHAR(MAX))
AS
BEGIN
    DECLARE @Query NVARCHAR(MAX)
@Query = 'SELECT ' + @DataColumnName + ', rn = ROW_NUMBER() OVER (ORDER BY ' + @DataColumnName + ') - 1
               FROM ' + @DataTableName
    Exec(@Query)

Извините за плохое понимание:

Вы выполнили запрос на обновление динамически, как запрос на выбор.

@Query='Update ' + @tablename +f'set' + @collname + ‘ =´ + @newvalue + ´where ‘ +@whereclause

А потом exec @query

Exec(@query)

РЕДАКТИРОВАТЬ для пользовательской функции в примере обновления:

CREATE FUNCTION ufAleaRandomString (@InputValue     varchar(MAX))
RETURNS varchar(MAX)
AS
BEGIN
    DECLARE @RetourValue varchar(MAX)
    SELECT @RetourValue = @InputValue + 'SomeModificationValue'
    RETURN @RetourValue
END
GO

CREATE TABLE #MyTable  
(PrimaryKey   int PRIMARY KEY,  
   KeyTransacFull      varchar(50) 
  );  
GO  


INSERT INTO #MyTable 
SELECT 1, '|H000021|B1|'

INSERT INTO #MyTable 
SELECT 2, '|H000021|B1|'


SELECT * FROM #MyTable


UPDATE #MyTable SET KeyTransacFull = dbo.ufAleaRandomString(KeyTransacFull) 

SELECT * FROM #MyTable

DROP TABLE  #MyTable

РЕЗУЛЬТАТ:

PrimaryKey     KeyTransacFull
1             |H000021|B1|
2             |H000021|B1|


PrimaryKey       KeyTransacFull
1               |H000021|B1|SomeModificationValue
2               |H000021|B1|SomeModificationValue
...