- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有更多表,其中包含大量生产中的条目,我想将它们移至历史数据库。
我已经尝试使用这个工作正常的查询,但我不知道是否有可能从外部给出一个表的名称。我不想为每个数据库和表编写此查询。
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/
我有以下正则表达式 /[a-zA-Z0-9_-]/ 当字符串只包含从 a 到z 大小写、数字、_ 和 -。 我的代码有什么问题? 能否请您向我提供一个简短的解释和有关如何修复它的代码示例? //var
我是一名优秀的程序员,十分优秀!