Questions tagged «sql-server»

所有版本的Microsoft SQL Server(非MySQL)。还请添加特定于版本的标记,例如sql-server-2016,因为它通常与问题相关。

4
如何合并具有不同有效日期的类似记录?
我正在处理的表包含三个部分: 一个ID柱(在另一个表中的主键) 一些数据列 日期有效from/ to列。 值: ID Data From To 1 a 2015-01-01 2015-01-05 1 a 2015-01-06 2015-01-10 1 b 2015-01-11 2015-01-15 1 a 2015-01-16 2015-01-20 2 c 2015-01-01 2015-01-05 2 c 2015-01-06 2015-01-10 通过以一定间隔获取另一个数据源的“快照”并将有效日期分配给记录来更新表。问题在于这些快照为记录(具有不同的有效日期)创建了重复的条目,这些记录在该时间间隔内根本没有更改。 我想通过查找具有连续日期的行并合并它们并为它们分配一个有效期来减小表的大小。例如: ID Data From To 1 a 2015-01-01 2015-01-10 1 b 2015-01-11 2015-01-15 1 a …

2
提交事务之前查询数据
我的理解是,在MS SQL Server Management Studio窗口中,执行“开始事务”然后进行一些更改(如将数据添加到表中)之后,您只能从同一窗口查询该表和那些更改,直到执行“提交交易”。 在执行“提交事务”之前,有什么方法可以从另一个来源进行查询吗? 具体到我当前的目标并添加一些上下文。我从Excel Power Query进行一些SQL查询。我真的很想能够在“提交事务”之前执行这些查询,以便我可以进行一些分析并弄清楚是否应该执行回滚而不是提交。

2
“签出”记录以进行处理的策略
我不确定是否有一个命名模式,或者没有,因为这是一个糟糕的主意。但是我需要我的服务才能在主动/主动负载平衡环境中运行。这仅是应用服务器。该数据库将位于单独的服务器上。我有一项服务,该服务将需要为表中的每个记录运行一个过程。此过程可能需要一到两分钟,并且每n分钟重复一次(可配置,通常为15分钟)。 拥有需要处理的1000条记录的表,以及针对同一数据集运行的两个服务,我希望每个服务“签出”要处理的记录。我需要确保一次只有一个服务/线程正在处理每个记录。 我的同事过去曾经使用过“锁定表”。将记录写入此表以在逻辑上锁定另一个表中的记录(该另一个表是静态的,并且添加了非常偶尔的新记录),然后将其删除以释放锁定。 我想知道对于新表来说,是否有更好的一列来表明它何时被锁定以及当前是否被锁定,而不是不断插入一个删除项,这会更好。 有人对这种事情有提示吗?是否有建立长期(逻辑)逻辑锁定的模式?如何确保一次仅锁定一项服务的任何提示?(我的同事使用TABLOCKX锁定整个表。)

3
列出索引和约束
我正在查看我继承的应用程序的SQL Server数据库。我已经有大约10年没有研究SQL Server了,所以请多多包涵。 我正在查看的数据库表有一个bigint NOT NULL名为的列id,但是,当我检查约束时,没有看到任何约束,所有数据库表也是如此。 我是否假设这些表上没有主键并且没有索引(聚集或非聚集),对吗? 我运行了以下查询,结果似乎证实了我的怀疑: //**returns 0** select count(*) from INFORMATION_SCHEMA.TABLE_CONSTRAINTS; //**returns no rows** select * from sys.indexes where object_id = (select object_id from sys.objects where name = 'NAME-OF-TABLE'); //**returns all tables in database** SELECT name FROM sys.tables WHERE OBJECTPROPERTY(object_id,'IsIndexed') = 0;

3
从插入触发器启动python脚本
我们有一段不错的python,它可以发送一些电子邮件并与云系统进行交互。工作良好。但是我们必须每隔几分钟触发一次以轮询数据库。出于业务目的,我们确实需要实时启动python脚本,因此没有轮询延迟。(这为与客户通电话的销售人员提供服务。) 我们真的不希望有1分钟的轮询循环。或30秒。我们希望该记录显示在数据库中,并让事情立即发生。 快速实现此目标的快速方法是在将特定记录类型插入表中时触发它。 我们可以从触发器中触发python脚本吗? 根据下面的Aaron注释,我们知道这是Very Bad Thing™,但是此表的使用很少(每天插入0-12次)。轮询表无法满足我们的业务需求(我们需要.py立即运行-它做的不仅仅是发送电子邮件)。 我们认为,满足业务需求的一种方法是在SQL Server上设置python的.net版本,然后让T-SQL以调用C#的方式调用python脚本... 但是我们不知道如何实际做到这一点!(请问这个问题)。 文档/详细信息? 我问了有关堆栈溢出的后续问题:如何在SQL Server中创建Python CLR过程? 问题下的问题:您有一块python。您希望它从SQL触发器中触发,但是您知道这是一件很糟糕的事情。那么,如何在不使用python代码的情况下真正实现相同的效果的SQL操作呢? 解决此需求的非触发,非轮询方法是什么? (相同的效果=“在表中发生插入/更新/删除,并且在db事件发生后2秒内触发了python脚本,而没有轮询表”)

1
如果varbinary数据的长度大于2000,则sys.fn_varbintohexstr返回NULL
如果VARBINARY数据长度最大为2000,则sys.fn_varbintohexstr可以正常工作。如果长度大于2000,则sys.fn_varbintohexstr返回NULL。我想念什么? DECLARE @testvarbinary VARBINARY(MAX) SELECT @testvarbinary = 0xFFD8FFE000104A46494600010100000100010000FFDB004300090607080706090807080A0A090B0D160F0D0C0C0D1B14151016201D2222201D1F1F2428342C242631271F1F2D3D2D3135373A3A3A232B3F443F384334393A37FFDB0043010A0A0A0D0C0D1A0F0F1A37251F253737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737373737FFC0001108007E005C03012200021101031101FFC4001B00000301010101010000000000000000000405060302010007FFC4003A100002010302030407080103050000000001020300041105211231411322516106718191A1B1D11423324252C1E1F03315247243A2D2E2F1FFC4001801000301010000000000000000000000000102030004FFC4001F1100020202020301000000000000000000000102112131034104122251FFDA000C03010002110311003F0096D26DAD2EB4BBBC1646E364000186380727C39FC2A05B218827383E35AC17B728922C7348A24FC60311C5EBACD237918051B9341D195A307C96C64D36D27499EE5FF0777AB31D97D746E97A4A16E39003C232CCC365AABD3AC85C42643C50D9A1FC58EF48454E53E91451B02B2D3ECED8810C4D7328DCB636ACF51BD78BBA63B751FA55B71EEA677921951A2B45FB3DA2F7709F89CF866A7353B66B6004B1852DBAC406E079D4AECA7AD0BEF6E44B8DB881DB0798F6D130D8D9DC420714EAF8DF707E9418B476513721C54C6C1256DE37E3239A9FA1D8D35D681562CBCD1A54FF0019627A6DBE3D54B5A09A26C12411E35FA1C68AD082008F6EF2F41E04797974A5BA9E991CE1C6386451B8E7ED1E345727E81C3B44A6188C926B48D805DCD75240CAC4374D8D0ECC1588C8F7D6AB1927583388851DEF7535D1ED8C8C5C292C7650694440C9270AEFBE6ACF4B8858E9C6E1C0E23B463CFC69E6E9118AB633D3AC3ED320B356C229E295C7C7E9EDA6F74DDB4B1D9DB2948D06000390AE74E84E9FA2F6B201DBCC3888EBBF214D74DB0105AB4B311DAB6ECC7E35CECE840B1DB2C518729961DD894F8D21BBD225BEBB62F9E007BCDD5CFD2AB228CDC66729C2A470C6BE0BFCD3286C91635D86E36DB993D6A6DB2918D91EBE8D3ADAA86C14639DFA5663D1E303A48991C2D8C8E87A57E866D87095C023C3C4560F64ACAF19C77971F434136525049123358B346268D543755C6C1BA8F51FDE95DCDB2B2F0AF351C51127703A827C460FBAAD161CA14FD6A41F261492F20026E3E1C296E21EDC1FEFAEA8883FC3F3DD52139ED00DCECC078D4DC9FE47C83CFC6AFB5CB2E195C22F5181ECC8F854BC964B2396006FCF90ABC1A233BD03E8B6FDADD2AE3CD8F80AB4B5B7FB76A76F6ABFE187BCD8F01CFE9483D1C80C61A4DB8B9EFF0001EFAAFD11560866BACE4B37086F21FD149C92B6371AA563591BB7BD8D3AF1777D7E34F6FA2ED3B2B31B2FE7C780E7F1DA907A384DDEA6D70C3B918E5E7FFC154AF8E29253D7BA0F90E7F1A9B781D2C9922069046ABDDD89F2F01FDF1A38292CB9F1A5F1DC3DAAF69716B2AAB9CF1819029B5ACB14F1C6F1B060C720D4D659D4B11356D872359B3F7D49D803BD17819C30A1E60983D3D7B51780ED500CF188AE4961D5587CA94EA30A8561D158EDE40E7E54E2ECF1C711CE79C648E9E1F3A5D749DBBA2EF97183EBE1A7E8E56B24BEA9171C6CC17246304788FEFC6A52EED1A3B9902120139D9B156F703B4B7CE7018FCC72A437363DBC9C5B02060ED4F1744E684DA70ECEC95B18E3CB7B05502B18748894ECDC238BD6DBFC89A5420FB94893C900A6BA903C10460EEC4B7B3181F0A57B19690EBD17FB8D34CA7F14CE5BD9FD1F1A375BBD92C6D2111A34B2960AA396FD727D64579A7C417B0B755FF181CBCBF9A6325A25DC87B400AA8C2F5A4BAD958C6DE09DB9D6B5A8EE96DD96D431E1EE8E271B8EA718F0F953CB2BB3C28C53B321B0E80EC0E456ADA45A63F0AE7C45613F6513A45100006DF029A4E2F48A45495DBB1D5EDE2A22F06E481B679D25D46FB4F8A45935092490A8FC11F1103D82B4BC950CF0E3903C8D793E97DB44F1A4AE9139058039CEF9FAD2C527B0BBAC1B417F61A8E9F33E9EEA5232090A4F74AF4DFD62BE231340413857CE7CBFA687D1B4DFB0B4D0AE7B29179F0E370303E1F2AD94F02A679E7869A5558219BC89EE515219106E63908DCF81A4174F2097EEC1E1C550DEA94B9BB5D8F112DFBD20C01CCD61582411333478EB9738E9B81464FF0079A84791DD5C03EFFE2B98814310DB90F6EDFCFC2BCE2FF7AF93B81CEB3322A74C7096F2DCB6C48DA8FB07E241BD4E25D715AA42A4E589DBCB63FC53BD31F85064E71492C1D3C237108E1E291B6E805235B888EA0BC6705F2513C05357B81FAB7C50C91DBBB481CA90472CF5A08A340DAB5C5BFDB638EDD959970C573838EB4E218CAC48C84B46C32A7C296358C0854C78CE3761CCFB69ADADC048C28C70A8C628E0D4CE269993209DFA1A5CEE385C83B238F767F9AD354982AB303D29569F722EDAE946E1635EBD467FF5A2B289F2A4A99C5F3715E7AD37F76FF2A9B983472B29C839A757127FBD018EE57F73F5A597E02DC927F300DCBDFF001CD325673CB07CD91328076046287656ED1F6C96C8DBD75B4985556272437BB72298DA409D8971F9188FDEB4B6088B349B9692FE78A418ECC285F31CC9F88AABB1DDCA13B11B5405F3CB6DE91433440FDE479651F98787C2ABF4EBF8EE22574700FCAB4E25B8A411AB5BDD9938ADA72D1E30571B8A1218AE480639FB391464E485F9D39B56ED46 select datalength(@testvarbinary) SELECT sys.fn_varbintohexstr(@testvarbinary)

1
如果NOT NULL,则UPDATE,否则保留字段的值
我认为以某种方式可以使它正常工作,但是由于某些原因,我仍然会出错。 我有以下UPDATE查询: UPDATE DeviceAttribute SET Details = CASE Name WHEN 'Accessories' THEN @Accessories WHEN 'Description' THEN @Description WHEN 'Specification' THEN @Specification ELSE Details END WHERE DeviceID = 10 参数由不同的用户填写。我现在面临的问题是,即使您要更新单个字段,也仍然必须用旧数据填写其他参数。因此,我想设置选项IF @parameter IS NULL然后保留已经存储在数据库中的值。我试图找到一些解决方案,类似以下查询的内容似乎是解决方案,但无法使其正常工作: UPDATE DeviceAttribute SET Details = CASE Name WHEN 'Accessories' IS NOT NULL THEN @Accessories WHEN 'Description' IS NOT …


2
ORDER BY CASE表达式出现“转换失败”错误
当我将“ OrderBy”设置为“ OrderNumber”时,以下存储过程可以很好地发挥作用。 我收到以下错误:将nvarchar值'SK11270'转换为数据类型int时转换失败。 (SK11270是OrderNumber列中的值,为nvarchar(50)) 如果我对任何其他OrderBy列运行相同的查询,则工作正常。 我完全迷路了,我的头很痛。谁能看到任何明显的原因会导致此问题? 预先感谢您的任何想法... 丰富 这有效: sp_jobs '1','20','','JobNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' 这不是: sp_jobs '1','20','','OrderNumber','ASC','97','True','True','True','True','True','True','True','True','True','False','True','False','True','False','0' PROCEDURE [dbo].[sp_Jobs] @PageNumber int, @PageSize int, @FilterExpression varchar(500), @OrderBy varchar(50), @OrderDirection varchar(50), @CustomerID int, @ShowNotSet bit, @ShowPlaced bit, @ShowProofed bit, @ShowReProofed bit, @ShowApproved bit, @ShowOnTime bit, @ShowLate bit, @ShowProblem bit, @ShowCompleted bit, @ShowDispatched bit, @ShowUnapproved …

1
接收字符输入和返回日期格式的函数(输入错误)
我需要编写一个函数来接收字符串字符并返回日期格式。例如输入是20120101,我需要这个2012-01-01。问题是可能有一些不正确的输入,例如“ 2012ABCD”。在这种情况下,我希望函数返回固定日期,例如2020-01-01。到目前为止,我写的是: Create Function ReturnDate (@date varchar(8)) Returns date as begin declare @result date set @result = (select convert(date , @date,111)) if(@@ROWCOUNT>0) return @result else return '2020-01-01' return @result end 这不起作用,我只是不知道如何处理第二部分(当输入不正确时)。

2
更改外键的引用索引
我有这样的事情: CREATE TABLE T1 ( Id INT ... ,Constraint [PK_T1] PRIMARY KEY CLUSTERED [Id] ) CREATE TABLE T2 ( .... ,T1_Id INT NOT NULL ,CONSTRAINT [FK_T2_T1] FOREIGN KEY (T1_Id) REFERENCES T1(Id) ) 出于性能(和死锁)的原因,我在T1上创建了一个新索引 CREATE UNIQUE NONCLUSTERED INDEX IX_T1_Id ON T1 (Id) 但是,如果我检查哪个索引引用了FK,则继续引用聚集索引 select ix.index_id, ix.name as index_name, ix.type_desc as index_type_desc, …

1
为什么MS SQL Server SEQUENCEs没有像Oracle这样的ORDER参数?
在T-SQL 的文档中CREATE SEQUENCE,您可以看到该CREATE SEQUENCE命令没有ORDER参数。 为了进行比较,用于CREATE SEQUENCE显示ORDER/ NOORDER选项的Oracle文档: ORDER 指定ORDER以确保按请求顺序生成序列号。如果将序列号用作时间戳,则此子句很有用。对于用于生成主键的序列,保证顺序通常并不重要。 ORDER仅在将Oracle数据库与Real Application Clusters一起使用时才有必要保证有序生成。如果使用独占模式,则序列号始终按顺序生成。 NOORDER 指定NOORDER是否不想保证按请求顺序生成序列号。这是默认值。 Microsoft SQL Server是否为SEQUENCEs 提供强大的排序约束?还是Microsoft总体上认为它不重要?

2
是否可以在LIKE语句上进行PIVOT
是否可以按表中的元素进行分组(如中所示COLUMN LIKE='Value%')PIVOT?我有一个表[DBT]。[Status],其中包含各种状态(数据库,实例等),并且不想将所有PROD和TEST值作为单个值进行透视/查询,而是将它们分组。 例如代替具有用于状态列Prod,Prod ACC,Prod APP,...等。我将仅有一个包含的值列Name LIKE 'Prod%'和Name LIKE 'Test%'。 到目前为止,我有: 表定义 CREATE TABLE [DBT].[Status]( [ID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) …

4
如何故意对SQL Server索引进行分段?
我想在我拥有的SQL Server 2017测试数据库上有意创建坏索引条件,只是为了更好地理解这些维护脚本?SQL Server索引和统计信息维护 是否有快速/自动的方式来破坏索引完整性或增加索引碎片?您知道我有什么有用的资源可以实现这一目标吗?

1
如何找到现有数据库的FamilyGUID
执行RESTORE命令时,我了解SQL Server确保现有数据库不会被其他数据库覆盖。可以使用绕过此检查REPLACE。 我了解SQL Server使用备份文件FamilyGUID来确定要还原的数据库是否与被覆盖的数据库相同。它是否正确? 我了解FamilyGUID可以使用以下方法确定备份文件的 RESTORE headeronly FROM DISK = N'Q:\MyBackup.bak' 但是,如何找到被覆盖的数据库的FamilyGUID?

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.