简单的SQL Server插入 - 从文本框到一列的许多逗号分隔值

时间:2015-03-28 04:18:06

标签: sql sql-server-2005 insert multiple-insert

这应该很简单。我有一个逗号分隔值的文本框(textarea)。

像这样:

425020,547538,548029,548853,552373

我有两种方式。一个表有两列,| Number6 | Number16 | ...和一个只有一列| Number6 |为了尝试消除任何混淆。对于下面的内容,它们是针对一个列表运行的。

以下是我尝试过的四种方式:

INSERT INTO MYDB.dbo.MYTABLE (Number6) 
VALUES (425020, 547538, 548029, 548853, 552373);

INSERT INTO MYDB.dbo.MYTABLE 
VALUES (425020, 547538, 548029, 548853, 552373);

INSERT INTO MYDB.dbo.MYTABLE (Number6) 
VALUES (425020), (547538), (548029), (548853), (552373);

INSERT INTO MYDB.dbo.MYTABLE 
VALUES (425020), (547538), (548029), (548853), (552373);

由于我是通过ASP页面提交的,因此我试图避免为每个值编写插入行。我之前有超过20,000个值。

显然上面的代码失败了,因为在第一个和第三个插入中,每个逗号都表示一个SQL列。在第二个和第四个插入中,","

附近的语法不正确

我构建了更复杂的查询,但由于某种原因,我无法弄清楚这个简单的插入。

我不是试图将整个字符串插入到单个字段中。我正在尝试使用具有五个数字的字符串并将它们分成5行。所以425020,547538,548029,548853,552373应该进入表格:

+--Number6--+
|  425020   |
|  547538   |
|  548029   |
|  548853   |
|  552373   |

2 个答案:

答案 0 :(得分:0)

SQL认为逗号是值之间的分隔符。所以123,456代表两个值,而不是一个字符串。

要解决您的问题,请更改此信息:

INSERT INTO MYDB.dbo.MYTABLE (Number6) VALUES (425020,547538,548029,548853,552373);

To This:

INSERT INTO MYDB.dbo.MYTABLE (Number6) VALUES ('425020,547538,548029,548853,552373');

我想知道为什么要将逗号分隔的字符串插入单个字段,这可能是一个糟糕的设计决定,但我认为你有充分的理由...

修改

好的,所以你稍微改了一下这个问题。如果你有一个包含多个值的文本框,你想要作为多行插入到表中,最简单的方法是使用string.split将逗号分隔列表转换为数组然后你可以遍历数组的元素一次插入一个。

答案 1 :(得分:0)

我在ASP中更改了代码,将文本框值写入文本文件。实际上我把两组值写成了两个单独的文本文件。

<%
function WriteToFile(FileName, Contents, Append)
on error resume next

if Append = true then
   iMode = 8
else 
   iMode = 2
end if
set oFs = server.createobject("Scripting.FileSystemObject")
set oTextFile = oFs.OpenTextFile(FileName, iMode, True)
oTextFile.Write Contents
oTextFile.Close
set oTextFile = nothing
set oFS = nothing

end function

%>
<%
WriteToFile "C:\INSTALL\Test1.txt", Response.Form("values1"), True
WriteToFile "C:\INSTALL\Test2.txt", Response.Form("values2"), True
%>

然后在StackOverlow的帮助下,我构建了以下SQL Query,它将每个文件读入自己的表中,然后将每个文件的数据并排组合,就好像我按照我的要求合并它们一样在这个问题上。

--Drop Tables in case they exist, Re-create them, import data from text file
DROP TABLE Table1
CREATE TABLE dbo.Table1 (NUMBER VARCHAR(16)) 
BULK INSERT dbo.Table1
FROM 'c:\install\Test1.txt' 
WITH (FIELDTERMINATOR = '\t', ROWTERMINATOR = '\n');

DROP TABLE Table2
CREATE TABLE dbo.Table2 (BIN VARCHAR(6)) 
BULK INSERT dbo.Table2
FROM 'c:\install\Test2.txt' 
WITH (FIELDTERMINATOR = '\t',ROWTERMINATOR = '\n');

--Prepare Table3 for merge of other two tables 
DROP TABLE Table3
CREATE TABLE dbo.TEMP (NUMBER VARCHAR(16), BIN VARCHAR(6));

--Combine Table1 with Table2 into Table3 (They called this a CTE)
WITH C1 AS
(SELECT ROW_NUMBER() OVER (ORDER BY dbo.Table1.NUMBER) AS Rn1,NUMBER FROM dbo.Table1),
C2 AS
(SELECT ROW_NUMBER() OVER (ORDER BY dbo.Table2.BIN) AS 
Rn2,BIN FROM dbo.Table2) 
INSERT INTO dbo.Table3 SELECT C1.NUMBER,C2.BIN FROM C1 INNER JOIN C2 ON C1.Rn1 = C2.Rn2;

我将上面的代码放到一行中并将其填入ASP中的INSERT RECORD帖子,woot!我没有粘贴获取值的代码,并将它们放入上面的值变量中,以防您看到丢失。

所以,没有用javascript解决javascript加入问题,但它仍然已经解决了,这对我来说很重要。