【问题标题】:Dynamic SQL to update table with random values from the same table使用同一表中的随机值更新表的动态 SQL
【发布时间】:2020-04-30 13:43:01
【问题描述】:

我想在以表名作为参数的存储过程中创建一个动态 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 Server),以便我可以将它与作为参数给出的任何表一起使用吗?

稍后编辑:到目前为止我已经这样做了(它将表名作为参数并更新它在该表中找到的每一列,但问题是在更新一列中的所有值之后相同)。
代码如下:

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|
-----------------------

任何想法如何设置不同的值?

【问题讨论】:

  • 您需要使用动态查询,为此检查:stackoverflow.com/questions/2838490/table-name-as-variable
  • 当我使用动态 sql 时,我要做的第一件事就是让查询正常工作(使用硬编码值) - 然后重写为动态。话虽如此,您打印出的查询是什么(您从 print @sql 获得的值是什么)并修复它以使其正常工作。

标签: sql sql-server stored-procedures dynamic


【解决方案1】:

只需将以下内容添加到您的 SQL 语句顶部 创建过程 [nameofprocedure] AS

【讨论】:

  • 好的,我知道创建存储过程的语法,但我需要在过程中使用动态查询以将表名作为参数,并动态遍历该表中的每一列并应用更新查询
猜你喜欢
  • 2017-06-04
  • 2013-01-21
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2015-08-12
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多