我有这个代码用于在下表中插入一些行 - 我从另一个已经填充的表中获取id。使用Compact 4.0本地数据库此处使用C#和Razor。
从sortedWord表中获取id:
Id | SortedWord
0 act
将数据插入到单词表中:
Id | Word | SortedId
0 cat 0
1 tac 0
for (var i = 0; i < words.Count(); i++){
queryString = "SELECT Id FROM SortedWords WHERE SortedWord = @0";
var sortedId = db.QuerySingle(queryString, sortWord(words[i]));
queryString = "INSERT INTO Words (Word, SortedId) VALUES (@0, @1)";
db.Query(queryString, words[i], sortedId.Id);
}
麻烦的是select语句是低效的,是否可以在没有select语句的情况下执行此操作,例如select into:我在这里看到了一些例子但是无法理解它。 http://technet.microsoft.com/en-us/library/ms189872(v=sql.105).aspx
答案 0 :(得分:2)
是的,你可以简单地使用:
INSERT Words (Word, SortedID)
SELECT @0, ID
FROM SortedWords
WHERE SortedWord = @1;
然后你的c#将成为:
queryString = " INSERT Words (Word, SortedID) SELECT @0, ID FROM SortedWords WHERE SortedWord = @1;"
db.Query(queryString, words[i], sortedwords[i]);
或者您可以将第一个查询嵌入到第二个查询中:
queryString = "INSERT INTO Words (Word, SortedId) VALUES (@0, (SELECT TOP 1 Id FROM SortedWords WHERE SortedWord = @1))";
db.Query(queryString, words[i], sortWord(words[i]));
但是,如果您使用的是SQL Server 2008或更高版本,我会更进一步,使用Table valued parameters一次完成所有插入操作。第一步是创建类型:
CREATE TYPE dbo.TwoStringList AS TABLE (Value1 VARCHAR(MAX), Value2 VARCHAR(MAX));
我使用了通用名称,因此类型更具可重用性。然后,您可以创建一个接受此类型作为参数的过程:
CREATE PROCEDURE dbo.InsertWords @StringList dbo.TwoStringList READONLY
AS
INSERT Words (Word, SortedID)
SELECT sl.Value1, sw.ID
FROM SortedWords sw
INNER JOIN @StringList sl
ON sw.SortedWord = sl.Value2;
然后你可以将它传递给SQL命令,如下所示:
var datatable = new DataTable();
datatable.Columns.Add(new DataColumn("Value1", typeof(string)));
datatable.Columns.Add(new DataColumn("Value2", typeof(string)));
for (var i = 0; i < words.Count(); i++)
{
var dr = datatable.NewRow();
dr[0] = words[i];
dr[1] = sortedwords[i];
datatable.Rows.Add(dr);
}
using (var connection = new SqlConnection("your Connection String"))
using (var command = new SqlCommand("dbo.InsertWords", connection))
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.Add(new SqlParameter{
ParameterName = "@StringList",
SqlDbType = SqlDbType.Structured,
TypeName = "dbo.TwoStringList",
Value = datatable
});
connection.Open();
command.ExecuteNonQuery();
}
<强> Example on SQL Fiddle 强>
答案 1 :(得分:1)
我对C#语法不太熟悉,但您可以这样做:
INSERT INTO Words (Word, SortedId)
SELECT @0,id
FROM sortedWords
WHERE sortedWord = @0;