0

私はこのようなExam_ResultテーブルとSubject_Infoテーブルを持っています....

1] Exam_Result table....

Resultid         numeric(18, 0)   Unchecked
Enroll_Number    varchar(50)      Checked
Student_Name     varchar(100)     Checked
Course_Id        varchar(50)      Checked
Semester         varchar(50)      Checked
Subject_Id       varchar(50)      Checked
MarksObtained    numeric(18, 0)   Checked
Exam_Type        varchar(50)      Checked

2] Subject_Info table....

Subject_Id       varchar(20)    Unchecked
Subject_Name     varchar(50)    Checked
Semester         varchar(10)    Checked
Course_Id        varchar(20)    Checked
Course_Type      varchar(20)    Checked

一度に各サブマークを挿入したい....たとえば、11111、Course_Id = CIV、Sem = 1 の一意の学生 Enroll_No の各サブマークを入力したい....

Enroll_Number 11111
Course_Id     CIV
Semester      1

これが件名です...このようなマークを入力したい....

Subject_Id   MarksObtained
EM           23
SM           25
CL           30

そして、この結果は Exam_Result テーブルに保存する必要があります....

注:科目は学期ごとに修正されるわけではありません。学校ごとに変更される可能性があります...したがって、動的なソリューションが必要です...

この問題を解決する方法を教えてください..??? または私にそれを与える他のsoltuon....事前にthnks

4

2 に答える 2

0

SQL Server 2005 では、INSERT... UNION ALL ハックを使用して、1 つのステートメントに複数の行を挿入できます。

INSERT INTO MyTable (FirstCol, SecondCol)
SELECT 'First' ,1
UNION ALL
SELECT 'Second' ,2
UNION ALL
SELECT 'Third' ,3
UNION ALL
SELECT 'Fourth' ,4
UNION ALL
SELECT 'Fifth' ,5

ここで詳細に説明されているように:

http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/

余談ですが、SQL Server 2008 では、複数行の挿入が TSQL によってネイティブにサポートされています。

INSERT INTO Customers (Name, City, Phone)
VALUES
    ('Customer #1', 'Jerusalem', '2343245'),
    ('Customer #2', 'Tel Aviv', '0987345'),
    ('Customer #3', 'Haifa', '275466')

http://blogs.microsoft.co.il/blogs/bursteg/archive/2007/12/05/sql-server-2008-t-sql-insert-multiple-rows.aspx

編集:

要求に応じて、C# でこのような文字列を作成するには、次のようにします。

// create some dummy data
var data = new List<Tuple<string, int>>
{
    new Tuple<string, int>("First", 1),
    new Tuple<string, int>("Second", 2),
    new Tuple<string, int>("Third", 3)
};

// create the [UNION ALL]...SELECT clauses
var selectClauses = String.Join(
    " UNION ALL ", 
    data.Select(t => String.Format("SELECT '{0}', {1}", t.Item1, t.Item2)));

// build our entire SQL string
// this results in the string:
// "INSERT INTO MyTable (FirstCol, SecondCol) SELECT 'First', 1 UNION ALL SELECT 'Second', 2 UNION ALL SELECT 'Third', 3"
var sql = "INSERT INTO MyTable (FirstCol, SecondCol) " + selectClauses;

// now execute this string against your database

このアプローチを使用する場合は、引用符のエスケープ、SQL インジェクションなどに注意する必要があります。これは、開始するためのものです。

于 2012-04-27T04:48:01.257 に答える
0

ループでできると思います ここに例があります

DECLARE @ID AS VARCHAR(25)

SET @ID = '1,2,3,4,'

@ID を TOTAL_ID として選択

DECLARE @DELIMITER CHAR(1)
SET @DELIMITER = ','

@CURRENTID を INT として宣言

WHILE(CHARINDEX(@DELIMITER,@ID,0) <> 0)

BEGIN
SELECT @CURRENTID = RTRIM(LTRIM(SUBSTRING(@ID,1,CHARINDEX(@DELIMITER,@ID,0 )-1 ))),

     @ID = RTRIM(LTRIM(SUBSTRING(@ID,CHARINDEX(@DELIMITER,@ID,0)+1,LEN(@ID))))

@CURRENTID を現在の ID として選択

@ID を REMAINING_ID として選択

終わり

あなたの要件に従って、私はあなたのためにループを行いました

DECLARE @IDSCORE AS VARCHAR(MAX)

SET @IDSCORE = 'EM,23,;SM,25,;CL,30,;'

DECLARE @MAINDELIMITER CHAR(1)

SET @MAINDELIMITER = ';'

DECLARE @DELIMITER CHAR(1)

SET @DELIMITER = ','

DECLARE @CURRENTIDSCORE VARCHAR(MAX)

DECLARE @SUBJECTID AS VARCHAR(10)

DECLARE @SCORE AS VARCHAR(10)

IF(@IDSCORE IS NOT NULL)

始める

WHILE(CHARINDEX(@MAINDELIMITER,@IDSCORE,0) <> 0)

始める

  PRINT @IDSCORE

  SELECT @CURRENTIDSCORE = RTRIM(LTRIM(SUBSTRING(@IDSCORE,1,CHARINDEX(@MAINDELIMITER,@IDSCORE,0 )-1 ))),
      @IDSCORE = RTRIM(LTRIM(SUBSTRING(@IDSCORE,CHARINDEX(@MAINDELIMITER,@IDSCORE,0)+1,LEN(@IDSCORE))))   
  SELECT @SUBJECTID = RTRIM(LTRIM(SUBSTRING(@CURRENTIDSCORE,1,CHARINDEX(@DELIMITER,@CURRENTIDSCORE,0 )-1 ))),
      @CURRENTIDSCORE = RTRIM(LTRIM(SUBSTRING(@CURRENTIDSCORE,CHARINDEX(@DELIMITER,@CURRENTIDSCORE,0)+1,LEN(@CURRENTIDSCORE))))
  SELECT @SCORE = RTRIM(LTRIM(SUBSTRING(@CURRENTIDSCORE,1,CHARINDEX(@DELIMITER,@CURRENTIDSCORE,0 )-1 ))),
      @CURRENTIDSCORE = RTRIM(LTRIM(SUBSTRING(@CURRENTIDSCORE,CHARINDEX(@DELIMITER,@CURRENTIDSCORE,0)+1,LEN(@CURRENTIDSCORE))))

  PRINT @CURRENTIDSCORE   

  PRINT @SUBJECTID

  PRINT @SCORE

終わり

終わり

于 2012-04-27T05:44:43.563 に答える