gpt4 book ai didi

c# - 从外部或变量将表名传递给 INSERT INTO 表名?

转载 作者:行者123 更新时间:2023-11-30 21:26:57 25 4
gpt4 key购买 nike

我有更多表,其中包含大量生产中的条目,我想将它们移至历史数据库。

我已经尝试使用这个工作正常的查询,但我不知道是否有可能从外部给出一个表的名称。我不想为每个数据库和表编写此查询。

INSERT INTO [database.history].dbo.tablename
SELECT *
FROM [database.live].dbo.table

DELETE FROM [database.history].dbo.tablename

我想从外部给出数据库和表的名称。我使用小巧的 ORM。有什么解决方案可以使用类似于其他类型的东西吗?例如。

DECLARE @ProductionTableName nvarchar(250) = '[database.live].dbo.table'

我的数据库在同一台服务器上。

我的查询在文件中,我的调用看起来像这样。

string query = queryFile;
var param = new {Parameter1= stringValue};
var result = Connection.Query<long>(query, param);

最佳答案

您不能在 SQL 中参数化标识符。您可以做的是使用动态 SQL。
但是请注意,除非操作正确,否则使用动态 SQL 可能很危险。

基本规则其实很简单——你必须参数化你能做的,把你不能做的列入白名单。
有关详细信息,请阅读我的博客文章 The do’s and don’ts of dynamic SQL for SQL Server.

此外,由于您要将记录从一个表移动到另一个表,因此您应该使用事务,否则,如果您的删除语句因错误而失败,插入语句将不会回滚,您最终会得到行存在于两个数据库中。
有关详细信息,请阅读 Understanding Cross-Database Transactions in SQL Server在红门上。

请注意,如果历史数据库与实时数据库位于不同的服务器上,您将需要 distributed transaction .

一个有效的例子是这样的:

DECLARE @TableName sysname = 'TableName',
@LineBreak nchar(2) = NCHAR(13) + NCHAR(10),
@Sql nvarchar(4000);

IF EXISTS(
SELECT 1
FROM [database.live].Information_schema.Tables
WHERE Table_Name = @TableName
)
BEGIN

SET @SQL = 'BEGIN TRANSACTION' + @LineBreak +
'BEGIN TRY' + @LineBreak +
'INSERT INTO [database.history].dbo.' + @TableName + @LineBreak +
'SELECT *' + @LineBreak +
'FROM [database.live].dbo.' + @TableName + @LineBreak +

'DELETE FROM [database.history].dbo.' + @TableName +
'COMMIT TRANSACTION' + @LineBreak +
'END TRY' + @LineBreak +
'BEGIN CATCH' + @LineBreak +
'IF @@TRANCOUNT > 0' + @LineBreak +
' ROLLBACK TRANSACTION' + @LineBreak +
'END CATCH' + @LineBreak

-- When working with dynamic SQL, Print is your best friend.
PRINT @SQL
-- Once you've verified that the SQL looks ok, you can unremark the EXEC statemet.
--EXEC sp_ExecuteSql @SQL
END

但是请注意,使用 insert 语句而不指定列列表以及使用 select * 被认为是不好的做法。
要将其添加到您的查询中,您可以查询 sys.columns 以获取您想要的表的列。

我还注意到问题中的代码不包含 where 子句 - 这意味着该行的全部内容将从实时数据库移动到历史数据库。

关于c# - 从外部或变量将表名传递给 INSERT INTO 表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518265/

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