it-swarm.asia

كيف يمكنني إدراج صفوف متعددة دون تكرار الجزء "INSERT INTO dbo.Blah" من العبارة؟

أعلم أنني قمت بذلك قبل سنوات ، لكن لا يمكنني تذكر بناء الجملة ، ولا يمكنني العثور عليه في أي مكان بسبب سحب الكثير من مستندات المساعدة ومقالات حول "الواردات بالجملة".

إليك ما أريد القيام به ، لكن بناء الجملة ليس صحيحًا تمامًا ... من فضلك ، شخصًا قام بذلك من قبل ، ساعدني :)

INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
    (124, 'Jonny'),
    (125, 'Sally')

أعرف أن هذا هو close إلى بناء الجملة الصحيح. قد أحتاج كلمة "السائبة" هناك ، أو شيء ما ، لا أستطيع تذكره. اي فكرة؟

أحتاج هذا لقاعدة بيانات SQL Server 2005. لقد جربت هذا الرمز ، ولكن دون جدوى:

DECLARE @blah TABLE
(
    ID INT NOT NULL PRIMARY KEY,
    Name VARCHAR(100) NOT NULL
)

INSERT INTO @blah (ID, Name)
    VALUES (123, 'Timmy')
    VALUES (124, 'Jonny')
    VALUES (125, 'Sally')

SELECT * FROM @blah

أتلقى Incorrect syntax near the keyword 'VALUES'.

496
Timothy Khouri
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'

بالنسبة لـ SQL Server 2008 ، يمكنك القيام بذلك في جملة VALUES واحدة بالضبط وفقًا للبيان الوارد في سؤالك (تحتاج فقط إلى إضافة فاصلة لفصل كل عبارة بيان) ...

313
gbn

بناء الجملة الخاص بك يعمل تقريبا في SQL Server 2008 (ولكن ليس في SQL Server 20051):

CREATE TABLE MyTable (id int, name char(10));

INSERT INTO MyTable (id, name) VALUES (1, 'Bob'), (2, 'Peter'), (3, 'Joe');

SELECT * FROM MyTable;

id |  name
---+---------
1  |  Bob       
2  |  Peter     
3  |  Joe       

1 عندما تمت الإجابة على السؤال ، لم يكن من الواضح أن السؤال كان يشير إلى SQL Server 2005. سأترك هذه الإجابة هنا ، لأنني أعتقد أنها لا تزال ذات صلة.

480
Daniel Vassallo

إذا كانت بياناتك موجودة بالفعل في قاعدة البيانات الخاصة بك ، يمكنك القيام بما يلي:

INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable

إذا كنت بحاجة إلى ترميز البيانات بشكل ثابت ، فإن SQL 2008 والإصدارات الأحدث تتيح لك القيام بما يلي ...

INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
223
George

يمكنك القيام بذلك (قبيح ولكنه يعمل):

INSERT INTO dbo.MyTable (ID, Name) 
select * from
(
 select 123, 'Timmy'
  union all
 select 124, 'Jonny' 
  union all
 select 125, 'Sally'
 ...
) x
13
davek

يمكنك استخدام الاتحاد:

INSERT INTO dbo.MyTable (ID, Name) 
SELECT ID, Name FROM (
    SELECT 123, 'Timmy'
    UNION ALL
    SELECT 124, 'Jonny'
    UNION ALL
    SELECT 125, 'Sally'
) AS X (ID, Name)
8
Cade Roux

يبدو هذا مناسبًا لـ SQL Server 2008. بالنسبة إلى SS2005 والإصدارات الأقدم ، تحتاج إلى تكرار عبارة VALUES.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
VALUES (124, 'Jonny')   
VALUES (125, 'Sally')  

تحرير :: بلدي سيئة. يجب عليك تكرار "INSERT INTO" لكل صف في SS2005.

INSERT INTO dbo.MyTable (ID, Name)  
VALUES (123, 'Timmy')  
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (124, 'Jonny')   
INSERT INTO dbo.MyTable (ID, Name)  
VALUES (125, 'Sally')  
6
DaveE

أنا أستخدم ما يلي:

INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10

ستضيف عشرة صفوف مع GUIDs فريدة من نوعها للمعرف والاسم.

ملاحظة: لا تنهي السطر الأخير (GO 10) بـ "؛" لأنه سيؤدي إلى حدوث خطأ: حدث خطأ فادح في البرمجة النصية. تمت مصادفة بناء جملة غير صحيح أثناء تحليل GO.

6
valentinvs
USE YourDB
GO
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
GO

أو يمكنك استخدام طريقة أخرى

INSERT INTO MyTable (FirstCol, SecondCol)
VALUES 
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
6
gngolakia

سيكون من الأسهل استخدام XML في SQL Server لإدراج صفوف متعددة وإلا يصبح الأمر شاقًا للغاية.

عرض المقالة كاملة مع شرح التعليمات البرمجية هنا http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx

انسخ الكود التالي في خادم sql لعرض عينة.

declare @test nvarchar(max)

set @test = '<topic><dialog id="1" answerId="41">
        <comment>comment 1</comment>
        </dialog>
    <dialog id="2" answerId="42" >
    <comment>comment 2</comment>
        </dialog>
    <dialog id="3" answerId="43" >
    <comment>comment 3</comment>
        </dialog>
    </topic>'

declare @testxml xml
set @testxml = cast(@test as xml)
declare @answerTemp Table(dialogid int, answerid int, comment varchar(1000))

insert @answerTemp
SELECT  ParamValues.ID.value('@id','int') ,
ParamValues.ID.value('@answerId','int') ,
ParamValues.ID.value('(comment)[1]','VARCHAR(1000)')
FROM @testxml.nodes('topic/dialog') as ParamValues(ID)
6
Joe

المقابلة لـ INSERT (Transact-SQL) (SQL Server 2005) لا يمكنك حذف INSERT INTO dbo.Blah ويجب عليك تحديده في كل مرة أو استخدام بناء جملة/منهج آخر ،

5
abatishchev

سيحقق هذا ما تسأل عنه:

INSERT INTO table1 (ID, Name)
    VALUES (123, 'Timmy'), 
           (124, 'Jonny'), 
           (125, 'Sally');

للمطورين المستقبليين ، يمكنك أيضًا إدراج من جدول آخر :

INSERT INTO table1 (ID, Name)
    SELECT 
         ID, 
         Name 
    FROM table2

أو حتى من جداول متعددة :

INSERT INTO table1 (column2, column3)
    SELECT 
         t2.column, 
         t3.column
    FROM table2 t2
         INNER JOIN table3 t3
         ON t2.ID = t3.ID
5
Tigerjz32

هذا يعمل بسرعة كبيرة ، وفعالة في SQL. افترض أن لديك جدول Sample with 4 column a,b,c,d where a,b,d are int and c column is Varchar(50).

CREATE TABLE [dbo].[Sample](
[a] [int] NULL,
[b] [int] NULL,
[c] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
[D] [int] NULL
)

لذلك لا يمكنك إدراج سجلات متعددة في هذا الجدول باستخدام الاستعلام التالي دون تكرار عبارة insert ،

DECLARE @LIST VARCHAR(MAX)
SET @LIST='SELECT 1, 1, ''Charan Ghate'',11
     SELECT 2,2, ''Mahesh More'',12
     SELECT 3,3,''Mahesh Nikam'',13
     SELECT 4,4, ''Jay Kadam'',14'
INSERT SAMPLE (a, b, c,d) EXEC(@LIST)

أيضًا باستخدام C # باستخدام SqlBulkCopy bulkcopy = new SqlBulkCopy(con)

يمكنك إدراج 10 صفوف في وقت واحد

   DataTable dt = new DataTable();
        dt.Columns.Add("a");
        dt.Columns.Add("b");
        dt.Columns.Add("c");
        dt.Columns.Add("d");
        for (int i = 0; i < 10; i++)
        {
            DataRow dr = dt.NewRow();
            dr["a"] = 1;
            dr["b"] = 2;
            dr["c"] = "Charan";
            dr["d"] = 4;
            dt.Rows.Add(dr);
        }
        SqlConnection con = new SqlConnection("Connection String");
        using (SqlBulkCopy bulkcopy = new SqlBulkCopy(con))
        {
            con.Open();
            bulkcopy.DestinationTableName = "Sample";
            bulkcopy.WriteToServer(dt);
            con.Close();
        }
2
Charan Ghate