Microsoft SQL Server,选择id并插入另一个表

时间:2013-12-12 12:12:49

标签: c# sql sql-server

我有这个代码用于在下表中插入一些行 - 我从另一个已经填充的表中获取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

2 个答案:

答案 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;