【发布时间】: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