简单的SQL Server插入-将文本框中的多个逗号分隔值插入到一个列中
简单的SQL Server插入-将文本框中的多个逗号分隔值插入到一个列中
这应该很简单。我有一个带有逗号分隔值的文本框(文本区域)。
像这样:
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 |
问题的原因是SQL将逗号视为值之间的分隔符。所以123,456表示两个值,而不是一个字符串。
解决方法是将原来的语句修改为将所有值作为一个字符串插入:
INSERT INTO MYDB.dbo.MYTABLE (Number6) VALUES ('425020,547538,548029,548853,552373');
不过我很好奇为什么你想要将逗号分隔的字符串插入到单个字段中,这可能是一个糟糕的设计决策,但我假设你有充分的理由...
编辑
好的,你稍微改变了问题。如果你有一个包含多个值的文本框,想要将它们作为多个行插入到表中,最简单的方法是使用string.split将逗号分隔的列表转换为数组,然后可以遍历数组的元素逐个插入。
我无法在此评论中找到如何使用代码块,所以我编辑了原帖回答你的问题。
问题的原因是在ASP代码中,作者将文本框的值写入了两个不同的文本文件中。然后,作者通过将每个文件的数据读入到各自的表中,并将这两个表的数据合并到一个新表中来解决问题。最后,作者将这段代码放入了一个INSERT RECORD的ASP代码中。
解决方法是使用SQL的BULK INSERT命令将文本文件的数据导入到数据库表中,并使用CTE(公共表表达式)将两个表的数据合并到一个新表中。最后,通过ASP代码将这段SQL代码作为INSERT RECORD的一部分执行。
以下是整理后的文章:
在ASP代码中,作者将文本框的值写入了两个不同的文本文件中。为了解决问题,作者通过将每个文件的数据读入到各自的表中,并将这两个表的数据合并到一个新表中来实现。下面是作者使用的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;
作者将这段代码放入了一个INSERT RECORD的ASP代码中。通过执行这段代码,作者成功解决了问题。
虽然作者没有提供获取值并将其放入values变量中的代码,但是问题已经得到了解决,这对作者来说是最重要的。