代码之家  ›  专栏  ›  技术社区  ›  MicWit

T-SQL:创建存储过程来更新表中的列,其中表和字段作为参数

  •  0
  • MicWit  · 技术社区  · 6 年前

    CreateRandomString 创建随机数据(替换客户端名称等,以便我们可以将数据用作演示)。现在我想创建一个存储过程,它将采用一个表名和一个列名,并用随机值替换该列中的所有数据(每列具有不同的随机值)。

    我以前做过mySQL和Oracle,但是现在在sqlserver工作,我一直在更新等等,我不知道表上的键等等,因为这是作为参数传入的。

    到目前为止我所拥有的:

    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 回复  |  直到 6 年前
        1
  •  2
  •   Vincent    6 年前

    这应该做什么你正在寻找。使用唯一标识符将数据与无意义的值混合,尽管您可以根据需要进行修改。

    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;
    
        2
  •  0
  •   Sanpas    6 年前

    嗨,我认为这个查询可以工作:

    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)
    

    抱歉,理解不好:

    您可以像查询perform select一样动态执行更新查询。

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

    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