我想在客户端计算机上运行程序时断开与设计时数据库的所有连接。因为它们在设计时都连接到另一个数据库,并且在创建要发布的新版本时可能保持连接。由于在客户端的onCreate中,它首先连接到测试数据库,然后执行我的程序(包括从ini文件中读取与数据库相关的设置并进行设置),因此出现错误。另外,我使用firedac组件来连接到数据库。
作为 Microsoft SQL Server 上的 T-SQL 项目的一部分,我使用递归联合 CTE 通过一些分层数据跟踪一系列子父关系,将每个单独的元素拉入一行,然后将其转换为单个元素排。
例如,我的递归联合 CTE 会将四个 HCC 值的以下行从 A(源表)转换为 B(递归联合表)。C 将是枢轴后期望的结果。
A
成员名字 | 父母名字 |
---|---|
HCC_AS1 | SEC_SMI |
SEC_SMI | BRC_AND |
BRC_AND | OBU_AND |
HCC_AK4 | BRC_BOZ |
BRC_BOZ | OBU_LKY |
HCC_BH1 | OBU_BGH |
肝细胞癌_Z5 | SEC_LNG |
SEC_LNG | BRC_LYN |
BRC_LYN | OBU_LNM |
乙
成员名字 | 父母名字 | 等级制度 | 价值 |
---|---|---|---|
HCC_AS1 | SEC_SMI | 美国证券交易委员会 | 星米 |
HCC_AS1 | SEC_SMI | 商业研究中心 | 和 |
HCC_AS1 | SEC_SMI | 奥布 | 和 |
HCC_AK4 | BRC_BOZ | 商业研究中心 | 博兹 |
HCC_AK4 | BRC_BOZ | 奥布 | 李光耀 |
HCC_BH1 | OBU_BGH | 奥布 | 脑脊液 |
肝细胞癌_Z5 | SEC_LNG | 美国证券交易委员会 | 液化天然气 |
肝细胞癌_Z5 | SEC_LNG | 商业研究中心 | 林恩 |
肝细胞癌_Z5 | SEC_LNG | 奥布 | 线性神经网络 |
C
成员名字 | 父母名字 | 美国证券交易委员会 | 商业研究中心 | 奥布 |
---|---|---|---|---|
HCC_AS1 | SEC_SMI | 星米 | 和 | 和 |
HCC_AK4 | BRC_BOZ | 博兹 | 李光耀 | |
HCC_BH1 | OBU_BGH | 脑脊液 | ||
肝细胞癌_Z5 | SEC_LNG | 液化天然气 | 林恩 | 线性神经网络 |
我唯一遇到的麻烦是保留原始内容MEMBER_NAME
和PARENT_NAME
整个递归 CTE,这是项目的要求。我将它包裹在游标中并插入到临时表中,这样我就有了一些东西供他们查看,但他们想将其更改为视图,所以我不相信我当前的设计会持续下去。我不太精通递归查询。是否有我缺少的解决方案可用于将其变成视图?
DECLARE @member varchar(80)
DECLARE @parent varchar(80)
CREATE TABLE #Temp
(
MEMBER_NAME varchar(80),
PARENT_NAME varchar(80),
Hierarchy varchar(80),
[Value] varchar(80)
);
DECLARE member_cursor CURSOR FOR
SELECT
[MEMBER_NAME], [PARENT_NAME]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
DIMENSION_NAME = 'Delivery_Center'
AND LEFT(MEMBER_NAME, 3) = 'HCC'
AND LEFT(PARENT_NAME, 3) IN ('SEC', 'OBU', 'BRC')
OPEN member_cursor
FETCH NEXT FROM member_cursor INTO @member, @parent
WHILE @@FETCH_STATUS = 0
BEGIN
WITH Parent AS
(
SELECT
LEFT(PARENT_NAME, CHARINDEX('_', Parent_name) -1) AS Hierarchy,
RIGHT(Parent_name, LEN(parent_name) - CHARINDEX('_', Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
MEMBER_NAME = @member
UNION ALL
SELECT
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) AS Hierarchy,
RIGHT(C.Parent_name, LEN(C.parent_name) - CHARINDEX('_', C.Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS] C
INNER JOIN
Parent ON C.member_name = parent.parent_name
WHERE
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) IN ('SEC', 'OBU', 'BRC')
)
INSERT INTO #Temp
SELECT
@member AS MEMBER_NAME, @parent AS PARENT_NAME, Hierarchy, [Value]
FROM
Parent
FETCH NEXT FROM member_cursor INTO @member, @parent
END
CLOSE member_cursor
DEALLOCATE member_cursor
SELECT * FROM #Temp
我尝试了光标,但那时我认为这可能只是一个每天构建一次的表。但他们希望它成为一个视图,所以我必须想出一个不需要光标的设计。
在我开始使用递归 CTE 之前,我尝试只做一个自连接表,但数据的子父关系并不一致。某些 HCC 值没有 SEC 或 BRC 或两者,因此仅执行三个自连接有时会将 OBU 放置在 SEC 或 BRC 列中。
我有 2 张桌子:
发票
CustomerInvoiceID - PK
RecordLocator - Text
createdDate - date
简化发票
CustomerInvoiceID - PK / FK Invoices
CountryCode - text
VatPercentage - number
SubtotalAmount - number
TotalAmount - number
如果我运行以下查询:
select
si.CountryCode,
si.RecordLocator,
si.CustomerInvoiceID,
i.CreatedDate,
i.VatPercentage,
si.SubTotalAmount,
si.TotalAmount
from
SimpliedInvoice si , invoice i
where
si.CustomerInvoiceID = i.CustomerInvoiceID
and si.CountryCode = 'GR'
我的结果是一个空数据集。
但如果我运行这个查询:
select *
from SimpliedInvoice
where CustomerInvoiceID in (select CustomerInvoiceID
from Invoice
where CountryCode = 'GR')
我得到了大量的数据。
我不明白为什么,有什么想法吗?
随着新的 SQL Server PS 模块的引入,Microsoft 已将 -Encrypt 参数强制设置为 Invoke-Sqlcmd cmdlet。
Invoke-Sqlcmd -ServerInstance $server -query $sql -Encrypt Optional
在我们的环境中:
- 我们有一个自定义 PowerShell 模块,其中包含大量 Invoke-Sqlcmd 调用。
- 我们管理数千台服务器,每台服务器都具有不同版本的 SQL Server PS 模块。
鉴于我们服务器上的 SQL Server PS 模块版本存在差异,我们的目标是利用 PowerShell 中的默认参数选项。为了实现这一点,我们在$PROFILE.AllUsersAllHosts配置文件中包含以下行:
$PSDefaultParameterValues['Invoke-Sqlcmd:Encrypt'] = 'Optional'
此设置适用于从 Visual Studio Code 执行的脚本。但是,我们的自定义模块中调用 Invoke-Sqlcmd 的函数会遇到故障。为了解决这个问题,我们通过使用以下行在模块中创建一个函数来实现另一种方法:
$PSDefaultParameterValues['Invoke-Sqlcmd:Encrypt'] = 'Optional'
因此,在使用模块中的任何函数之前,我们执行负责设置可选值的函数。
考虑到这些挑战,是否有更有效的替代方案?此外,当加载PowerShell模块时,它在哪个范围内运行?我们怎样才能在这个范围内建立可选值呢?
我正在尝试学习如何使用 Entity Framework Core 迁移,但出现以下错误:
无法创建类型为“”的“DbContext”。异常“找不到实体类型“电影”的合适构造函数。以下构造函数的参数无法绑定到实体类型的属性:
无法在“Movie(int negativePoints, int PositivePoints, List comments, string title, MediaType type)”中绑定“negativePoints”、“positivePoints”、“comments”
请注意,只有映射的属性可以绑定到构造函数参数。无法绑定对相关实体的导航,包括对拥有类型的引用。尝试创建实例时抛出。有关设计时支持的不同模式,请参阅https://go.microsoft.com/fwlink/?linkid=851728
根据我的理解和研究,不可能使用Add-Migration
抽象类执行该过程,您能否确认这一点或为我提供提示?
我用一个简单的类测试了该过程,没有使用媒体,没有任何问题。
这是我的DbContext
课:
public class AppDbContext : DbContext
{
public IConfiguration _config { get; set; }
public AppDbContext(IConfiguration config)
{
_config = config;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(_config.GetConnectionString("DatabaseConnection"));
}
public DbSet<Movie> Movie { get; set; }
//public DbSet<Game> Game { get; set; }
//public DbSet<User> User { get; set; }
}
我的Media
课:
public abstract class Media
{
public Guid Id { get; set; }
public int? NegativePoints { get; set; }
public int? PositivePoints { get; set; }
public List<Comment>? Comments { get; set; }
public string Title { get; set; }
public MediaType Type { get; set; }
public Media(int negativePoints, int positivePoints, List<Comment> comments, string title, MediaType type)
{
Id = new Guid();
NegativePoints = negativePoints;
PositivePoints = positivePoints;
Comments = comments;
Title = title;
Type = Type;
}
}
我的Movie
课:
public class Movie : Media
{
public string? Director { get; set; }
public string? Genre { get; set; }
public DateTime? Release { get; set; }
public string? AgeRating { get; set; }
public string? Synopsis { get; set; }
public List<string>? Actors { get; set; }
public TimeOnly? Duration { get; set; }
public string? Language { get; set; }
public string? ContryOrigin { get; set; }
public string? ProductionStudio { get; set; }
public string? Trailer { get; set; }
public Movie(int negativePoints, int positivePoints, List<Comment> comments, string title, MediaType type) : base(negativePoints, positivePoints, comments, title, type)
{
Type = MediaType.Movie;
Director = null;
Genre = null;
Release = null;
AgeRating = null;
Synopsis = null;
Actors = new List<string>();
Duration = null;
Language = null;
ContryOrigin = null;
ProductionStudio = null;
Trailer = null;
}
}
如果您有任何其他建议,我将很高兴收到您的来信。
我正在使用.NET 8.0
我正在尝试生成然后复制多个UNIQUEIDENTIFIER
值用作NEWID()
测试数据。以下是我的尝试,首先生成 N1 个值,然后使用 aCROSS APPLY
将这些值每个复制 N2 次:
SELECT *
FROM (
SELECT
S1.value,
NEWID() AS Id
FROM GENERATE_SERIES(1, 3) S1
) S1
CROSS APPLY (
SELECT
S2.value,
S1.Id -- Trying to repeat the same ID value multiple times
FROM GENERATE_SERIES(1, 2) S2
) S2
ORDER BY S1.Value, S2.Value
期望的结果:
价值 | ID | 价值 | ID |
---|---|---|---|
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 2 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 3 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 1 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 3 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
实际结果:
价值 | ID | 价值 | ID |
---|---|---|---|
1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb | 1 | 26d1f8c0-05e8-4d6f-91ab-f97ce13f79fb |
1 | 8dbf1b38-f6af-4b7e-9b3d-65f3df4bb017 | 2 | 8dbf1b38-f6af-4b7e-9b3d-65f3df4bb017 |
1 | 2eddb5e1-4f3e-4938-ab7b-49740a20a779 | 3 | 2eddb5e1-4f3e-4938-ab7b-49740a20a779 |
2 | 4743c229-0c3c-44fd-b9f8-9406b06e350e | 1 | 4743c229-0c3c-44fd-b9f8-9406b06e350e |
2 | f8a66f07-04da-44ab-af7b-47a747dc6bf6 | 2 | f8a66f07-04da-44ab-af7b-47a747dc6bf6 |
2 | 034876b6-8cf5-4264-810d-de5202554d77 | 3 | 034876b6-8cf5-4264-810d-de5202554d77 |
我知道这NEWID()
将为使用它的每一行生成唯一的值,但我认为在子查询中使用时,这些值将在该子查询中生成,而不是在最外层生成。如果这种行为在NEWID 文档或其他地方我找不到明确的解释。
CAST()
我尝试使用、TOUPPER()
和插入中间计算REPLACE()
,我认为这可以捕获并巩固这些NEWID()
值。我还尝试将第一部分包裹在 CTE 中。我仍然无法重复生成的值。
我可以使用 #temp 表或 @table 变量分多个步骤执行此操作,但我只是想知道是否有一种方法可以在单个语句中完成此操作。
这是另一个类似的案例:
-- Another similar case
WITH CTE AS (
SELECT NEWID() AS Id -- Is this one value or many?
)
SELECT *
FROM ( VALUES (1), (2), (3) ) ID(Id)
CROSS JOIN CTE
跟进:
我在dba stackexchange上发现了一个类似的问题,它向我指出了一份15 年前的 Microsoft Connect 错误报告和讨论,最终该错误报告因无法修复、功能按设计而被关闭。其基本原理是,“优化器不保证标量函数的执行时间或次数”,并且“很难准确确定……每行一次的行为意味着什么。”
同一篇文章有一个较晚的评论,找到了一种使用GROUP BY
和的组合FULL OUTER JOIN
来诱导所需行为的解决方法,但后来的评论表明这仍然是未定义的行为。
我还发现了一些2005 年的旧书在线文档,其中包含最佳实践:“将非确定性函数的使用限制在最外层的选择列表中。” 我在当前文档中找不到相同的内容,但可能没有在正确的位置查找。
因此,尽管 ValNik 下面的答案提出了一种涉及 的解决方法GROUP BY
,但我认为这也是建立在不稳定基础上的。(ValNik 的回答实际上是从“没有意义”的评论开始的。)
我还发现添加IS NOT NULL
检查也可以达到所需的结果(小提琴)。同样,这可能是未定义的行为,但似乎有效 - 最好避免。
最重要的是,最好遵循旧的“将非确定性函数的使用限制到最外层选择列表”实践,这意味着选择临时表或表变量,如 Thom A 推荐和 nbk 记录为答案。
我正在使用 ASP.NET Core 8、Entity Framework 和 Linq 连接到 SQL Server 数据库,但收到此错误
System.InvalidOperationException:ConnectionString 属性尚未初始化
当尝试从 SQL Server 数据库获取数据时。我没有使用Startup.cs
- 相反,我正在使用program.cs
.
这是我的代码:
public class MasterDAL : IMasterDAL
{
private readonly MyDbContext _context;
IConfiguration _configuration;
public MasterDAL(MyDbContext context, IConfiguration configuration)
{
_context = context;
_configuration = configuration;
}
public IEnumerable<CategoryViewModel> getCategory()
{
List<CategoryViewModel> categoryModel = new List<CategoryViewModel>();
categoryModel = (from cat in _context.CategoryMasters.AsNoTracking()
select new CategoryViewModel
{
CategoryId = cat.CategoryMasterId,
CategoryName = cat.CategoryName
}).Distinct().ToList();
return categoryModel;
}
}
DbContext
:
public partial class MyDbContext : DbContext
{
private readonly IConfiguration _config;
public MyDbContext (DbContextOptions<MyDbContext> options)
: base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlServer(ConfigHelperDB.GetConnectionString("DefaultConnection"),
options => options.EnableRetryOnFailure());
}
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<CategoryMaster>(entity =>
{
entity.HasKey(e => e.CategoryMasterId)
.HasName("PK_CategoryMaster_CategoryMasterId");
entity.Property(e => e.CreatedDate)
.HasDefaultValueSql("(getdate())");
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
Program.cs
:
builder.Services.AddDbContextPool<MyDbContext>(
options => options.UseSqlServer(ConfigHelperDB.GetConnectionString("DefaultConnection"),
options => options.EnableRetryOnFailure()));
builder.Services.AddScoped<DbContext, MyDbContext>();
请帮我解决这个错误。
我尝试过删除
builder.Services.AddScoped<DbContext, ExpenseDbContext>();
我也尝试添加
builder.Services.AddTransient<DbContext, ExpenseDbContext>();
我们已将 SQL Server 更新到最新的 2022 版本,以期获得更好的性能,但即使是简单的查询,结果也相反。例如下面的查询在兼容性级别 100 下运行,仅进行 250 次逻辑读取,并在 10 毫秒内执行。如果我们将兼容性级别更改为 160 ,其读取次数将增加至 12000,持续时间将增加至 270 毫秒。
SELECT TOP 1 id, detail
FROM shopdetail WITH (NOLOCK)
WHERE id> 589530 AND detail <>''
ORDER BY id ASC
当我们检查执行计划时,它从索引查找更改为索引扫描。
有人可以帮助如何使优化器使用有效的计划而不是使用选项提示吗?
ID 列是主键,detail 列具有非聚集索引。
ALTER TABLE [dbo].[shopdetail] ADD CONSTRAINT [pk_shopdetailID] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
GO
我正在尝试删除一个表:
drop table if exists bronze.LawAggregatedPipelineSummary;
go
但它有一个 FK 约束:
无法删除对象“bronze.LawAggreatedPipelineSummary”,因为它由 FOREIGN KEY 约束引用。
我试图识别约束,但无法通过 找到它sp_fkeys
。尝试了以下四个调用中的每一个sp_fkeys
:但结果都是空的:
exec sp_fkeys 'bronze.LawAggregatedPipelineSummary'
exec sp_fkeys 'LawAggregatedPipelineSummary'
exec sp_fkeys @pktable_name = 'bronze.LawAggregatedPipelineSummary'
exec sp_fkeys @pktable_name = 'LawAggregatedPipelineSummary'
所以我在同一台服务器上有两个数据库
- 数据库测试
- 数据库开发
我想制作包含所有数据、表结构和所有内容的DB_TEST的完整副本,并将DB_DEVELOP更改为相同。
我知道我在创建 DB_DEVELOP 时做了类似的事情,但我不确定现在该怎么做,我想保留 DB_DEVELOP与其相同的名称和权限,以便我可以在开发模式下处理应用程序但使用DB_DEVELOP数据库,因此我不会破坏DB_TEST数据库中的某些内容,该数据库稍后将成为生产数据库
我尝试过的
创建DB_TEST的备份,但当我单击恢复时,我在DB_DEVELOP中看不到它。
编写数据库脚本,但是当我在DB_DEVELOPCREATE To
中运行脚本时,它不起作用。
具有架构和数据的脚本数据库未插入第一个数据库中的所有数据。
复制数据库会导致以下错误:
名称和目标数据库保持相同非常重要。
我尝试删除开发数据库以创建一个新数据库,如类似问题的答案中所述,但出现错误:3702
我不知道任何用户正在使用数据库,我的应用程序没有运行,至少不是连接到该数据库的版本,并且在我的 SSMS 中,我没有打开任何与所述数据库相关的窗格