2016-05-13 12 views
0

私はそれが名前@table_nameでテーブルにダミー行を挿入し、プロシージャからそれを返し任意のテーブルを指定するとダミー行を返すストアドプロシージャを作成できますか?

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

のようなプロシージャを作成することが可能ですか疑問に思って。 @table_nameに主キーがあることを想定してください。例えば

、私は

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 
) 

で作成

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

のようなテーブルがあると私は

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

関連する問題