gpt4 book ai didi

c# - SQL Server 存储过程 - 检查是否存在任何记录,如果不存在则插入

转载 作者:行者123 更新时间:2023-11-30 14:51:47 24 4
gpt4 key购买 nike

问题:

是否可以向 SQL Server 2012 发送一个指定时间数组的单个调用,以便数据库服务器可以检查这些元素是否存在,如果不存在,则将它们插入表中?

问题:

我面临的问题是,我有一个预定作业(调用 API),每次调用它时都会返回大约 400 条记录。这项工作每分钟调用一次,最慢的事情是,对于每个结果,我都在检查数据库是否已经有记录,如果没有,那么我正在执行 INSERT。

示例:API 返回 400 人。我希望能够在对数据库的一次调用中发送每个人的 ID 以及姓名等。然后数据库应该检查并查看 ID 是否存在(对于每个人),如果不存在,则执行插入。

反馈:

我还想知道这是否真的是好的做法,或者是否有更好的处理方法。

最佳答案

根据我的理解,作业将结果返回给应用程序 (C#),然后该应用程序为每条记录调用数据库。

答案是肯定的,您可以在一个补丁中将多条记录(数据表)发送到sql server,然后sql server 将处理所有这些数据。

首先在 SQL Server 中,您必须定义一个表数据类型,其格式将从应用程序发送到数据库。

CREATE TYPE YourDataType AS TABLE(
[Col1] [int] NULL, [Col2] [int] NULL, [Col3] [int] NULL, [Col4] [nvarchar](255) NULL,
[Col5] [nvarchar](255) NULL, [Col6] [nvarchar](255) NULL, [Col7] [nvarchar](255) NULL, [Col8] [nvarchar](255) NULL,
[Col9] [nvarchar](255) NULL, [Col10] [nvarchar](255) NULL, [Col11] [int] NULL, [Col12] [nvarchar](255) NULL,
)
GO

然后创建将使用该数据类型的过程

CREATE PROCEDURE YourProcedureName (@TableVariable YourDataType READONLY, @ScalarParameter nvarchar(255))
AS

BEGIN
INSERT INTO YourTable WITH (ROWLOCK) (Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12 )

SELECT Col1,Col2,Col3,Col4,Col5,Col6,Col7,Col8,Col9,Col10,Col11,Col12

FROM @TableVariable t
/*Left Join then where ID is null to make sure the record doesn't exists*/
LEFT JOIN YourTable PR WITH (NOLOCK)
ON PR.ID = @ScalarParameter
AND PR.Col1 = t.Col1
AND PR.Col2 = t.Col2
......
WHERE PR.ID IS NULL
END

最后使用您的数据从您的应用程序调用此过程。我在这里使用 VB.Net 编写它,但您可以用 C# 重写它:

    Dim connectionString As StringBuilder = New StringBuilder()
connectionString.AppendFormat("Server={0};", ????)
connectionString.AppendFormat("Database={0};", ???)
connectionString.AppendFormat("User ID={0};", ????)
connectionString.AppendFormat("Password={0}", ????)

Dim InputTable As DataTable = New DataTable("YourDataType")
InputTable = ds.Tables(0).Copy()
InputTable.TableName = "YourDataType"

Try
Using conn As New SqlClient.SqlConnection(connectionString.ToString())
Using comm As New SqlClient.SqlCommand()
Dim insertedRecords As Int32

comm.Connection = conn
comm.CommandText = "YourProcedureName"
comm.CommandType = CommandType.StoredProcedure
Dim TableVariable As SqlClient.SqlParameter = comm.Parameters.Add("@TableVariable", SqlDbType.Structured)
TableVariable.Direction = ParameterDirection.Input
TableVariable.Value = InputTable
Dim ScalarVariable As SqlClient.SqlParameter = comm.Parameters.Add(@ScalarParameter, SqlDbType.VarChar)
ScalarVariable.Direction = ParameterDirection.Input
ScalarVariable.Value = ???

conn.Open()
insertedRecords = comm.ExecuteNonQuery()
If (insertedRecords > 0) Then
_Changed = True
End If
conn.Close()

comm.Dispose()
conn.Dispose()
End Using
End Using
Catch ex As Exception
Return False
End Try
Return True

关于c# - SQL Server 存储过程 - 检查是否存在任何记录,如果不存在则插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33490287/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com