0

这应该很简单。我有一个带有逗号分隔值的文本框(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   |
4

2 回答 2

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 查询,它将每个文件读入自己的表中,然后并排组合来自每个文件的数据,就像我在这个问题中要求的那样合并它们.

--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 帖子中,哇!我没有粘贴获取值并将它们放入上面的 values 变量的代码,以防您发现丢失。

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

于 2015-03-28T17:30:59.393 回答
0

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

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

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

对此:

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

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

编辑

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

于 2015-03-28T04:39:39.133 回答