2016-05-13 30 views
0

我想知道是否有可能创建一个像是否有可能创建一个存储过程,给定一个任意表,返回一个虚拟行?

CREATE PROCEDURE GetDummyRow 
    @table_name VARCHAR(128) 
BEGIN 
    -- ... 
END 

是插入到一个表名@table_name虚设行并从过程返回它的过程。预计@table_name有一个主键。

举例来说,如果我有一个像

========================================== 
       Persons 
============================================ 
id | first_name | last_name | spouse_id 
============================================ 
1 | "John" | "Skeet"  |  2 
2 | "Jane" | "Skeet"  |  1 
3 | "Bjarne" | "Stroustrup" | NULL 

CREATE TABLE Persons 
(
    id INT AUTO_INCREMEMENT, 
    first_name VARCHAR(50) NOT NULL, 
    last_name VARCHAR(50) NOT NULL, 
    spouse_id INT, 
    PRIMARY KEY id, 
    FOREIGN KEY spouse_id REFERENCES Persons.id 
) 

创建

一个表,我想

DECLARE @t VARCHAR(128); 
@t = 'Persons'; 
EXEC GetDummyRow(@t) 

返回

4 | "ASDbaj" | "OEROANkaskoaASDOLJ" | NULL 

4 | "okasdALAJajdlaLashdasi" | "OEROANkaskoaASDOLJadasd" | 3 

例如。

是否有任何逻辑的原因,这将是不可能的?

+4

是的,这是可能的,但是这将是非常艰巨的编写。我会认真寻找另一种方式去做任何你想做的事情。 –

+0

是的,这很复杂,会很快得到惊人的。您正试图创建一些将随机值插入任何表的动态代码。这开始变得非常困难,如果不是不可能的话,还有一些数据类型。您还必须考虑现有的外键和约束,以便插入不会失败。它可以做到,但需要做出令人难以置信的努力才能使其足够强大以实际工作。考虑到动态性,它可能会非常慢! –

回答

0

如果您可以使用默认值来指定虚拟行的值,那么这可以被简化很多。

CREATE TABLE Persons 
(
    id INT IDENTITY(1,1) NOT NULL, 
    first_name VARCHAR(50) NOT NULL DEFAULT 'Dummy', 
    last_name VARCHAR(50) NOT NULL DEFAULT 'Value', 
    spouse_id INT 
) 
GO 

CREATE PROCEDURE GetDummyRow (@table_name NVARCHAR(128)) 
AS 
BEGIN 
    DECLARE @sql nvarchar(MAX) 
    SET @sql = N'INSERT INTO ' + @table_name + N' DEFAULT VALUES 
    SELECT * FROM ' + @table_name + N' WHERE id = SCOPE_IDENTITY()' 
    exec sp_executesql @sql 
END 
GO 

EXEC GetDummyRow 'Persons' 

如果值需要是随机的,您可以使用NEWID()作为缺省:

CREATE TABLE Persons 
(
    id INT IDENTITY(1,1) NOT NULL, 
    first_name VARCHAR(50) NOT NULL DEFAULT NEWID(), 
    last_name VARCHAR(50) NOT NULL DEFAULT NEWID(), 
    spouse_id INT 
) 
GO 

http://sqlfiddle.com/#!3/85776/1

+0

如果您可以使用相同的值,这绝对是您的选择。 –

0

要回答你的问题,没有没有理由认为这是不可能的。正如评论它可能会变得复杂...

有几个要求不是很清楚。当你说虚拟数据时,你不会说随机或唯一的,但我猜测你不会想要每行都有相同的虚拟数据。这需要根据您想要支持的数据类型来进行额外的编码。

我会基于表架构创建一个游标。然后循环遍历列构建数据类型和约束/索引的代码。它是主键还是外键,是自动编号还是存在检查限制。您可以从小处着手,并为不适合最受期待类型的表/列进行异常处理。

根据数据库的体系结构和复杂性,您可以利用自动编号的主键等功能。

如果存在外键,您可以随机选择引用表中的键(即Top 1 ... From)或递归地调用过程以在该表中插入虚拟记录并返回新键。这需要将大部分功能放在一个内部过程中,该过程返回一个主键和一个返回您正在查找的结果集的包装器。

我相信这些链接将是一个好的开始,查找的主题将导致其他的例子。

https://msdn.microsoft.com/en-us/library/ms186778.aspx

https://msdn.microsoft.com/en-us/library/ms177862.aspx

相关问题