Jak wstawić wiele wierszy bez powtarzania " wstaw do dbo.Bla " część oświadczenia?
Wiem, że robiłem to już wiele lat temu, ale nie pamiętam składni i nie mogę go znaleźć nigdzie z powodu wyciągania ton dokumentów pomocy i artykułów o "importach masowych".
Oto, co chcę zrobić, ale składnia nie jest dokładnie w porządku... proszę, ktoś, kto już to robił, niech mi pomoże:)
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally')
Wiem, że jest to blisko do właściwej składni. Mogę potrzebować słowa "masa", czy coś, nie pamiętam. Jakiś pomysł?
Potrzebuję tego do bazy danych SQL Server 2005. Próbowałem tego kodu, bez skutku:
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
I ' m getting Incorrect syntax near the keyword 'VALUES'.
13 answers
INSERT INTO dbo.MyTable (ID, Name)
SELECT 123, 'Timmy'
UNION ALL
SELECT 124, 'Jonny'
UNION ALL
SELECT 125, 'Sally'
Dla SQL Server 2008, może to zrobić w jednej klauzuli wartości Dokładnie zgodnie z Instrukcją w twoim pytaniu(wystarczy dodać przecinek, aby oddzielić każdą instrukcję wartości)...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-27 13:05:00
Twoja składnia prawie działa w SQL Server 2008 (ale nie w 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 Kiedy na to pytanie udzielono odpowiedzi, nie było oczywiste, że pytanie odnosi się do SQL Server 2005. Zostawiam tę odpowiedź tutaj, ponieważ uważam, że jest ona nadal aktualna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 14:11:19
Jeśli Twoje dane są już w Twojej bazie danych możesz zrobić:
INSERT INTO MyTable(ID, Name)
SELECT ID, NAME FROM OtherTable
Jeśli potrzebujesz twardego kodu danych, SQL 2008 i nowsze wersje pozwalają wykonać następujące czynności...
INSERT INTO MyTable (Name, ID)
VALUES ('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-30 22:22:54
Mógłbyś to zrobić (brzydki ale działa):
INSERT INTO dbo.MyTable (ID, Name)
select * from
(
select 123, 'Timmy'
union all
select 124, 'Jonny'
union all
select 125, 'Sally'
...
) x
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 19:23:15
Używając INSERT INTO ... VALUES
składni jak w Daniel Vassallo ' S odpowiedz
jest jedno irytujące ograniczenie:
From MSDN
Maksymalna liczba wierszy, które można zbudować poprzez wstawienie wierszy bezpośrednio do listy wartości, wynosi 1000
Najprostszym sposobem na pominięcie tego ograniczenia jest użycie pochodnej tabeli, takiej jak:
INSERT INTO dbo.Mytable(ID, Name)
SELECT ID, Name
FROM (
VALUES (1, 'a'),
(2, 'b'),
--...
-- more than 1000 rows
)sub (ID, Name);
to będzie działać począwszy od SQL Server 2008+
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-08 14:20:16
Możesz użyć Unii:
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-12 19:24:30
To wygląda OK dla SQL Server 2008. W przypadku SS2005 i wcześniejszych, musisz powtórzyć instrukcję VALUES.
INSERT INTO dbo.MyTable (ID, Name)
VALUES (123, 'Timmy')
VALUES (124, 'Jonny')
VALUES (125, 'Sally')
EDIT:: mój błąd. Musisz powtórzyć "INSERT INTO" dla każdego wiersza w 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')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 17:21:28
Byłoby łatwiej używać XML w SQL Server do wstawiania wielu wierszy, w przeciwnym razie staje się to bardzo żmudne.
Zobacz pełny artykuł z objaśnieniami kodu tutaj http://www.cyberminds.co.uk/blog/articles/how-to-insert-multiple-rows-in-sql-server.aspx
Skopiuj poniższy kod do sql server, aby wyświetlić próbkę.
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)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 00:16:20
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
LUB MOŻESZ UŻYĆ INNEGO SPOSOBU
INSERT INTO MyTable (FirstCol, SecondCol)
VALUES
('First',1),
('Second',2),
('Third',3),
('Fourth',4),
('Fifth',5)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 07:36:27
Używam:
INSERT INTO [TableName] (ID, Name)
values (NEWID(), NEWID())
GO 10
Doda dziesięć wierszy z unikalnymi identyfikatorami GUID dla identyfikatora i nazwy.
Uwaga: nie kończ ostatniej linii (idź 10) znakiem';', ponieważ spowoduje to błąd: wystąpił fatalny błąd skryptu. Podczas parsowania GO napotkano nieprawidłową składnię.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-28 13:04:30
Odpowiadający INSERT (Transact-SQL) (SQL Server 2005) nie można pominąć INSERT INTO dbo.Blah
i trzeba go każdorazowo określać lub użyć innej składni / podejścia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-13 17:33:15
To działa bardzo szybko i wydajnie w SQL.
Załóżmy, że masz tabelę 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
)
Więc nie można wstawić wielu rekordów w tej tabeli za pomocą następującego zapytania bez powtarzania instrukcji 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)
Również z C # używając SqlBulkCopy bulkcopy = new SqlBulkCopy(con)
Możesz wstawić 10 wierszy na raz
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();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-19 21:31:20
To osiągnie to, o co prosisz:
INSERT INTO table1 (ID, Name)
VALUES (123, 'Timmy'),
(124, 'Jonny'),
(125, 'Sally');
Dla przyszłych programistów, można również wstawić z innej tabeli :
INSERT INTO table1 (ID, Name)
SELECT
ID,
Name
FROM table2
Lub nawet z wielu tabel :
INSERT INTO table1 (column2, column3)
SELECT
t2.column,
t3.column
FROM table2 t2
INNER JOIN table3 t3
ON t2.ID = t3.ID
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-18 17:08:04