Questions tagged «sql-server-2008»

使用此标记可以解决针对Microsoft SQL Server 2008版本的特定问题。

2
用户定义的表类型是否拒绝EXECUTE权限?
我对SQL Server 2008中的用户定义表类型有疑问。 为了满足ASP.NET应用程序之一的需要,我们在SQL Server 2008上定义了自己的表类型,以将它们用作存储过程中的参数(在ASP.NET应用程序中执行sql命令时,我们将DataTable对象作为存储过程的参数传递请看这里的例子) 问题是,当我们从ASP.NET运行Sql命令(执行存储过程)时,出现错误: 对对象'ourTableType',数据库'ourDatabase',模式'ourSchema'的EXECUTE权限被拒绝。 为什么呢?为什么我们需要对用户定义的表类型设置权限?为什么仅在使用权限的存储过程上设置权限还不够?如果我们要设置它,不管是什么,为什么没有EXECUTE在属性窗口的任何许可类型集(我只看到Control,References,Take Ownership,View Definition)? 我还不明白的是,Control在属性窗口中将权限设置为可以解决问题,并且存储过程可以正常运行。

5
在大型表上增加VARCHAR列的大小时,可能会出现问题吗?
我正在使用SQL Server 2008,并且需要在具有约50万行的表上将VARCHAR字段变大,从(200到1200)。我需要知道的是是否有未考虑的问题。 我将使用以下TSQL语句: ALTER TABLE MyTable ALTER COLUMN [MyColumn] VARCHAR(1200) 我已经在数据副本上进行了尝试,并且该语句没有我看到的不良影响。 那么这样做有没有我可能没有考虑过的问题呢? 顺便说一句,该列未编制索引。



5
MS SQL比较日期?
我有2个日期(日期时间): date1 = 2010-12-31 15:13:48.593 date2 = 2010-12-31 00:00:00.000 在同一天,只是时间不同。由于日期1的时间,使用<=比较日期1和日期2不起作用。因此date1 <= date2是错误的,但应为true。我可以仅通过查看年,月和日来比较它们是否相同?它的SQL Server 2008。 谢谢 :)

9
提高大表上的SQL Server查询性能
我有一个相对较大的表(当前有200万条记录),想知道是否有可能提高即席查询的性能。临时一词在这里是关键。添加索引不是一种选择(最常见查询的列上已经有索引)。 运行一个简单的查询以返回100条最近更新的记录: select top 100 * from ER101_ACCT_ORDER_DTL order by er101_upd_date_iso desc 需要几分钟。请参阅下面的执行计划: 表扫描的其他详细信息: SQL Server Execution Times: CPU time = 3945 ms, elapsed time = 148524 ms. 该服务器运行sql server 2008 r2 x64的功能非常强大(内存48GB ram,24核处理器)。 更新资料 我发现此代码创建具有1,000,000条记录的表。我以为我可以SELECT TOP 100 * FROM testEnvironment ORDER BY mailAddress DESC在几个不同的服务器上运行,以了解服务器上的磁盘访问速度是否较差。 WITH t1(N) AS (SELECT 1 …

4
如何在MS SQL Server存储过程中声明数组?
我需要用光标声明与每个月的年份相对应的12个十进制变量,然后对这些变量的值求和,然后再更新一些销售信息。 我不知道sql server是否具有此语法 Declare MonthsSale(1 to 12) as decimal(18,2) 此代码可以正常工作。! CREATE PROCEDURE [dbo].[proc_test] AS BEGIN --SET NOCOUNT ON; DECLARE @monthsales TABLE ( monthnr int, amount decimal(18,2) ) -- PUT YOUR OWN CODE HERE -- THIS IS TEST CODE -- 1 REPRESENTS JANUARY, ... INSERT @monthsales (monthnr, amount) VALUES (1, 100) …



3
T-SQL和WHERE LIKE%Parameter%子句
我试图编写一条使用WHERE LIKE'%text%'子句的语句,但是当我尝试为文本使用参数时我没有收到结果。例如,这有效: SELECT Employee WHERE LastName LIKE '%ning%' 这将返回用户Flenning,Manning,Ningle等。但是此语句不会: DECLARE @LastName varchar(max) SET @LastName = 'ning' SELECT Employee WHERE LastName LIKE '%@LastName%' 未找到结果。有什么建议么?提前致谢。

3
如何使视图列NOT NULL
我正在尝试创建一个我只希望列为true或false的视图。但是,无论我做什么,SQL Server(2008)似乎都认为我的bit列可以以某种方式为null。 我有一个名为“产品”的表,其“状态”列为INT, NULL。在视图中,我想为Product中的每一行返回一行,如果Product.Status列等于3,则BIT列设置为true,否则位字段应该为false。 示例SQL SELECT CAST( CASE ISNULL(Status, 0) WHEN 3 THEN 1 ELSE 0 END AS bit) AS HasStatus FROM dbo.Product 如果我将此查询另存为视图并查看“对象资源管理器”中的列,则HasStatus列设置为BIT, NULL。但是它永远不能为NULL。是否有一些魔术SQL技巧可以用来强制使该列成为NOT NULL。 请注意,如果删除CAST()周围的CASE,则该列正确设置为NOT NULL,但是该列的类型设置为INT,这不是我想要的。我希望如此BIT。:-)

8
简单的DateTime SQL查询
如何查询一定范围内的DateTime数据库字段? 我正在使用SQL SERVER 2005 错误代码如下 SELECT * FROM TABLENAME WHERE DateTime >= 12/04/2011 12:00:00 AM AND DateTime <= 25/05/2011 3:53:04 AM 请注意,我需要获取特定时间范围内的行。例如,10分钟的时间范围。 目前,SQL返回的语法不正确,位于'12'附近。”

4
bcp / BULK INSERT与表值参数的性能
BULK INSERT由于架构已更改,我将不得不使用SQL Server的命令重写一些相当旧的代码,我想到也许我应该考虑改用TVP切换到存储过程,但是我想知道会有什么效果它可能会影响性能。 一些背景信息可能有助于解释为什么我问这个问题: 数据实际上是通过Web服务输入的。该Web服务将文本文件写入数据库服务器上的共享文件夹,该文件夹随后执行BULK INSERT。此过程最初是在SQL Server 2000上实现的,当时实际上除了INSERT在服务器上删除几百条语句外,别无选择,这实际上是原始过程,并且会造成性能灾难。 数据被批量插入到永久登台表中,然后合并到更大的表中(此后将从登台表中删除)。 要插入的数据量是“大”的,而不是“巨大的”-通常只有几百行,在极少数情况下可能是5-10k行。因此,我的直觉是,BULK INSERT作为一个未记录的操作不会有太大的不同(但我当然不确定,因此是问题)。 插入实际上是更大的流水线批处理过程的一部分,需要连续多次进行。因此性能是至关重要的。 我想将其替换BULK INSERT为TVP的原因是: 通过NetBIOS编写文本文件可能已经花费了一些时间,并且从体系结构的角度来看这是非常可怕的。 我认为可以(并且应该)取消登台表。造成这种情况的主要原因是,插入的数据需要在插入的同时用于其他两次更新,而尝试从大量生产表进行更新要比使用几乎为空的登台要昂贵得多表。对于TVP,参数基本上是临时表,我可以在主插入之前/之后使用它进行任何操作。 我几乎可以消除重复检查,清理代码以及与批量插入相关的所有开销。 如果服务器一次获得一些事务,则无需担心登台表或tempdb上的锁争用(我们尝试避免这种情况,但它确实发生了)。 显然,在将任何产品投入生产之前,我将对此进行概要分析,但是我认为在我度过所有时间之前先询问一下是一个好主意,看看是否有人为此发布使用TVP的严厉警告。 所以-对于任何对SQL Server 2008足够熟悉的人尝试过或至少对此进行过调查,那么结论是什么?对于插入(例如几百到几千行)的情况,TVP是否会切芥菜?与散装刀片相比,性能有显着差异吗? 更新:现在问号减少了92%! (又称:测试结果) 经过36阶段的部署过程之后,最终结果现已投入生产。两种解决方案都经过了广泛的测试: 提取共享文件夹代码并SqlBulkCopy直接使用该类; 使用TVP切换到存储过程。 以便读者可以了解到底经过了什么测试,以消除对这些数据的可靠性的任何疑问,这是对该导入过程实际作用的更详细说明: 从通常约20至50个数据点的时间数据序列开始(尽管有时可能会增加几百个)。 对其进行大量疯狂的处理,这些处理基本上独立于数据库。此过程是并行的,因此(1)中大约8-10个序列被同时处理。每个并行过程会生成3个附加序列。 取所有3个序列和原始序列,并将它们合并为一批。 将现在完成的所有8-10个处理任务中的批次合并为一个大的超级批次。 使用BULK INSERT策略(请参阅下一步)或TVP策略(跳至步骤8)导入它。 使用SqlBulkCopy该类将整个超级批处理转储到4个永久登台表中。 运行一个存储过程,该存储过程是(a)在两个表上执行一系列聚合步骤,包括几个JOIN条件,然后(b)MERGE在6个生产表上使用聚合和非聚合数据执行a 。(完成) 要么 生成4个DataTable对象,其中包含要合并的数据;其中3个包含CLR类型,但不幸的是ADO.NET TVP没有正确地支持它们,因此必须将它们作为字符串表示形式使用,这会严重影响性能。 将TVP馈送到存储过程,该过程基本上与(7)相同,但直接与接收到的表一起进行。(完成) 结果相当接近,但是TVP方法最终平均表现更好,即使数据超过1000行少量。 请注意,此导入过程连续运行了数千次,因此仅通过计算完成所有合并所花费的小时数(是,小时),就很容易获得平均时间。 最初,平均合并几乎要花8秒钟才能完成(在正常负载下)。消除NetBIOS的麻烦并切换为SqlBulkCopy将时间减少到几乎恰好7秒。切换到TVP可以将时间进一步减少到每批5.2秒。对于运行时间以小时为单位的过程,这将使吞吐量提高35% -一点也不差。与相比,也提高了约25%SqlBulkCopy。 实际上,我相当有信心,真正的进步远不止于此。在测试过程中,很明显,最终的合并不再是关键的路径。相反,进行所有数据处理的Web服务开始受到输入请求数量的限制。CPU和数据库I / O都没有真正达到极限,并且没有明显的锁定活动。在某些情况下,我们发现连续合并之间存在几秒钟的空闲间隔。使用时有一点缝隙,但要小得多(半秒左右)SqlBulkCopy。但是我想那将成为另一天的故事。 结论:表值参数确实比BULK INSERT在中型数据集上执行复杂的导入+转换过程的操作要好。 …

10
WHERE子句可查找特定月份的所有记录
我希望能够给存储过程一个月和一年,并使其返回该月发生的所有事情,我该怎么做,因为在某些月份的天数不同等情况下我无法进行比较? 最好的方法是什么?我可以要求根据年份和月份进行比较吗? 谢谢。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.