我有以下SQL:
IF EXISTS
(
SELECT
1
FROM
SomeTable T1
WHERE
SomeField = 1
AND SomeOtherField = 1
AND NOT EXISTS(SELECT 1 FROM SomeOtherTable T2 WHERE T2.KeyField = T1.KeyField)
)
RAISERROR ('Blech.', 16, 1)
Run Code Online (Sandbox Code Playgroud)
该SomeTable表有大约200,000行,SomeOtherTable表格大致相同.
如果我执行内部SQL(SELECT),它会在亚秒内执行,不返回任何行.但是,如果我执行整个脚本(IF...RAISERROR),则需要一个多小时.为什么?
现在,显然,执行计划是不同的 - 我可以在企业管理器中看到 - 但是,为什么呢?
我可能会做SELECT @num = COUNT(*) WHERE......然后IF @num > 0 RAISERROR......但是......我认为这有点失误.如果您知道它存在,您只能编写一个错误代码(对我来说它确实看起来像个错误).
编辑:
我要指出,我已经尝试过重跳汰查询到OUTER JOIN按@波希米亚的答案,但本作的执行时间没有差异.
编辑2:
我附上了内部SELECT语句的查询计划:

...以及整个IF...RAISERROR块的查询计划:

显然这些显示了真实的表/字段名称,但除此之外,查询完全如上所示.
我有一个 Web 应用程序,其中 Angular (7) 前端与服务器上的 REST API 通信,并使用 OpenId Connect (OIDC) 进行身份验证。我正在使用向我的 HTTP 请求HttpInterceptor添加Authorization标头以向服务器提供身份验证令牌。到现在为止还挺好。
但是,除了传统的 JSON 数据,我的后端还负责即时生成文档。在添加身份验证之前,我可以简单地链接到这些文档,如下所示:
<a href="https://my-server.com/my-api/document?id=3">Download</a>
Run Code Online (Sandbox Code Playgroud)
但是,现在我已经添加了身份验证,这不再有效,因为浏览器在获取文档时没有在请求中包含身份验证令牌 - 所以我401-Unathorized从服务器得到了响应。
因此,我不能再依赖普通的 HTML 链接——我需要创建自己的 HTTP 请求,并显式添加身份验证令牌。但是,我如何确保用户体验与用户单击链接时的体验相同?理想情况下,我希望使用服务器建议的文件名保存文件,而不是通用文件名。
我有一个数据库表,记录了允许用户访问的出版物.该表非常简单 - 它只存储用户ID /发布ID对:
CREATE TABLE UserPublication (UserId INTEGER, PublicationID INTEGER)
Run Code Online (Sandbox Code Playgroud)
给定用户和发布的记录的存在意味着用户具有访问权限; 没有记录意味着无法访问.
我想向管理员用户提供一个简单的屏幕,允许他们配置用户可以访问的出版物.我想为每个可能的出版物显示一个复选框,并检查用户当前可以访问的出版物.然后,管理员用户可以检查或取消检查任意数量的出版物并提交表单.
有各种各样的出版物类型,我想将类似类型的出版物组合在一起 - 所以我确实需要控制出版物的呈现方式(我不想只是有一个平面列表).
我的视图模型显然需要有一个所有出版物的列表(因为无论当前选择如何,我都需要显示它们),而且我还需要用户当前可以访问的出版物列表.(我不确定我是否会更好地使用单个列表,其中每个项目包括发布ID和是/否字段?).
但就我而言,这就是我的意思.我真的不知道如何将它绑定到一些复选框.我从哪里开始?
这不建议:http://msdn.microsoft.com/en-us/library/ee519072(v = vs.110).aspx
但是,但是...... 真的吗?
Office 2007仍然无处不在 - 当然他们还没有放弃对它的支持吗?我需要支持它,似乎这意味着我不能使用VS2012.
或许这个限制只适用于RC?(请).或者它可能会创建2010年定位但仍可以在2007年运行的加载项?(抓着稻草).
告诉我它不是这样......
我开发了一个ASP.NET MVC 2网站,现在需要将它部署到我的Web服务器上.我已经克服了一些障碍,因为ASP.NET没有安装等等,但我现在已经到了可以提供普通内容文件的地步,如果我尝试点击我的一个MVC URL,我得到这个:
无法加载文件或程序集'System.Web.Mvc,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.该系统找不到指定的文件.
不足为奇,因为我没有安装MVC2.问题是,我找不到有关如何安装它的任何好信息!
在微软下载中心列出了3个文件,其中没有一个看好:
ASP.NET-MVC-2-RTM-RELEASE-Notes.doc
AspNetMVC2_VS2008.exe
mvc2-ms-pl.zip
该网站并不打算解释文件实际是什么,但我认为最后一个文件是源代码.无论如何,这就是它的样子.发行说明没有任何帮助,因为它们都是关于在开发机器上安装的,实际上EXE的名称清楚地说明了所有关于Visual Studio集成的内容.
那么我该如何实际部署这个糟糕的东西呢?
与Scott Gu的博客相关联的另一个选项是Microsoft Web Platform Installer.现在,我不想安装不仅仅是MVC2,而且我已经安装了IIS等,所以这看起来有点沉重.但这都是学术性的,因为它拒绝在我的服务器上运行,说"你的系统不受支持"或者说是这样的话.(服务器是Windows Server 2008 Standard SP2,所以我真的不知道它的问题是什么).
救命!
[荒谬的是,这应该是如此艰难 - 或者根本不是很难,但肯定是一个保守的秘密!]
我已经让ELMAH在我的(Cassini)开发服务器上工作了,并且非常满意它,但是现在我正试图将所有东西都移到我的生产服务器(IIS7),蜜月看起来就像结束了.
我已经超越了IIS7的"陷阱",坦率地说可以在文档中更好地突出显示,如果我只是使用内存中的日志,那么它可以工作.
但是,我试图让它使用SQL Server日志(就像我在我的开发系统上那样),并且我得到了一个错误:
对象ELMAH_GetErrorsXml上的EXECUTE权限被拒绝
好吧,好吧.我知道如何授予数据库权限,但我真的很难理解我需要授予访问权限的用户和哪些存储过程/表.
让我感到困惑的是,我没有做任何这样的事情让它在我的开发服务器上工作.我能看到的唯一区别是,在我的开发服务器上它似乎连接为NT AUTHORITY\IUSR,而在我的生产服务器上它似乎连接为NT AUTHORITY\NETWORK SERVICE.(它只是使用可信连接,所以我没有明确配置它来做到这一点 - 我认为它与Web服务器有关).更新:我已经确定,因为我正在使用Cassini,它实际上是以我(管理员)而不是IUSR登录,这解释了为什么我没有得到任何权限问题.
在我的开发服务器上,IUSR帐户是公共数据库角色的成员,并且可以访问所需的数据库(再次作为"公共").没有明确授予对象级权限.[见上面的更新 - 这是无关紧要的].
在我的生产服务器上,我以完全相同的方式添加了NETWORK SERVICE(公共数据库角色,显式访问数据库为"public").然而,我得到了这个权限错误.为什么?!![请参阅上面的更新 - 我没有获得权限错误的唯一原因是因为我作为管理员运行].
而且,当然,如果它在本地工作的事实只是"运气",我将需要知道授予访问权限的SP /表.我的猜测是所有3个SP而不是表,但是(再次)看到一些使这个显式的文档会很好.
如果您向Web服务器发出HTTP请求,并返回类型为image/jpeg的响应,那么二进制数据如何实际编码?它是通过线路的图像的原始字节级内容,还是它的一些基于字符的表示(例如base64)?
我有一个使用各种第三方库(如JSON.NET)构建的应用程序.
我想确保构成我的应用程序的所有DLL都经过数字签名,包括第三方.鉴于这些未经作者签名,我是否可以/我应该自己签署第三方签名?
编辑:底部添加堆栈跟踪.
我有一个ASP.NET MVC 5项目,它通过Entity Framework 6使用SQL Server数据库.
我将Glimpse(和Glimpse.MVC5)添加到项目中,这很好.
但是,当我添加Glimpse.EF6时,我的应用程序一旦尝试访问数据库就会抛出异常.例外是:
System.NotSupportedException
无法确定"System.Data.SqlClient.SqlClientFactory"类型的提供程序工厂的提供程序名称.确保在应用程序配置中安装或注册了ADO.NET提供程序.
这是怎么回事?仅供参考,connectionStrings我的web.config部分如下所示:
<connectionStrings>
<add name="DefaultConnection" connectionString="Data Source=.; Initial Catalog=foo; Integrated Security=True; MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)
...我的Application_Start方法看起来像这样:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
Database.SetInitializer(new WebApplication.Models.Storage.ApplicationDbInitializer());
}
Run Code Online (Sandbox Code Playgroud)
...我的上下文类看起来像这样:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
public DbSet<Foo> Foos { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢任何帮助......
堆栈跟踪:
[NotSupportedException: Unable to determine the provider name for provider factory of type 'System.Data.SqlClient.SqlClientFactory'. Make …Run Code Online (Sandbox Code Playgroud) 假设我有一个IEnumerable<T>,我想获取第一个元素并将其余元素传递给其他代码.我可以使用前n个元素Take(n),但是如何在不导致枚举重新启动的情况下访问其余元素?
例如,假设我有一个ReadRecords接受CSV文件中的记录的方法IEnumerable<string>.现在假设在该方法中,我想读取第一个记录(标题),然后将剩余的记录传递给ReadDataRecords也采用的方法IEnumerable<string>.像这样:
void ReadCsv(IEnumerable<string> records)
{
var headerRecord = records.Take(1);
var dataRecords = ???
ReadDataRecords(dataRecords);
}
void ReadDataRecords(IEnumerable<string> records)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果我准备重新开始枚举,那么我可以使用dataRecords = records.Skip(1).但是,我不想重新启动它 - 事实上,它可能无法重新启动.
那么,有没有办法获取第一个记录,然后是剩余的记录(除了通过将所有值读入新的集合并重新枚举它们)?
asp.net-mvc ×2
.net ×1
angular ×1
asp.net ×1
auth-token ×1
c# ×1
code-signing ×1
data-binding ×1
elmah ×1
glimpse ×1
http ×1
http-headers ×1
iis-7 ×1
linq ×1
mime-types ×1
office-2007 ×1
release ×1
sql ×1
sql-server ×1
viewmodel ×1
vsto ×1