我有用于将某些行插入到下表中的代码-我正在从已经填充的另一个表中获取ID。在此处使用带有C#和Razor的Compact 4.0本地数据库。
从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/zh-CN/library/ms189872(v=sql.105).aspx
是的,您可以简单地使用:
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或更高版本,我将进一步使用表值参数一次完成所有插入操作。第一步是创建类型:
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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句