Questions tagged «t-sql»

Transact-SQL(T-SQL)是Microsoft SQL Server和SAP的Sybase使用的SQL的方言。

2
SSMS和注册服务器结果
背景: 我们正在尝试为我们的一个支持团队创建AG“主要”测试工具。不知道在任何给定时间哪些服务器将是指示它们针对已注册服务器组执行TSQL的主要服务器。注册的服务器组由AG中的所有服务器组成。目标是仅在当前主服务器上执行TSQL: 当前测试线束: IF EXISTS (SELECT * FROM sys.dm_hadr_availability_replica_states AS HARS INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME)) BEGIN <<SOME CODE TO EXECUTE>> END 问题: 如果第一台响应多服务器查询的服务器未返回任何结果,则SSMS将假定正确的结果集为没有结果集,即使其他服务器随后返回了结果集也是如此。因此,在这种情况下,不会返回任何结果……这是不正确的,也不是预期的功能。 谁能想到使用SSMS(这是CS团队最熟悉的工具)强制在当前主服务器上执行的方法吗?

3
无法插入到新创建的列中
我有一个像这样的简单测试表: CREATE TABLE MyTable (x INT); 在事务中,我尝试添加一列,然后插入到新创建的列中: BEGIN TRANSACTION; PRINT 'Adding column, ''SupplementalDividends'', to MyTable table.'; ALTER TABLE MyTable ADD SupplementalDividends DECIMAL(18,6); PRINT 'Column added successfully....'; PRINT 'Ready to INSERT into MyTable ...'; INSERT INTO MyTable (x, SupplementalDividends) VALUES (1, 3.2); PRINT '**** CHANGES COMPLETE -- COMMITTING.'; COMMIT TRANSACTION; 当我运行上面的代码时,问题是一条错误消息: …

4
在触发器中是否为SELECT * OK。还是我在找麻烦?
我在工作中陷入一场辩论,我需要一些有关我可能会忽略的陷阱的建议。 想象一下使用触发器将已删除记录复制到审核表的情况。触发器使用SELECT *。每个人都指向并大喊,并告诉我们这有多糟糕。 但是,如果对主表的结构进行了修改,而忽略了审计表,则触发器将产生一个错误,使人们知道审计表也需要修改。 在我们的DEV服务器上进行测试的过程中将捕获该错误。但是我们需要确保生产匹配DEV,因此我们在生产系统中允许SELECT *(仅适用于触发器)。 所以我的问题是:我被迫删除SELECT *,但是我不确定如何确保我们自动捕获这种性质的开发错误,任何想法或这是最佳实践? 我在下面整理了一个例子: --Create Test Table CREATE TABLE dbo.Test(ID INT IDENTITY(1,1), Person VARCHAR(255)) --Create Test Audit Table CREATE TABLE dbo.TestAudit(AuditID INT IDENTITY(1,1),ID INT, Person VARCHAR(255)) --Create Trigger on Test CREATE TRIGGER [dbo].[trTestDelete] ON [dbo].[Test] AFTER DELETE NOT FOR REPLICATION AS BEGIN SET NOCOUNT ON; …

1
为一个文件夹中的多个.DTSX软件包文件确定PackageFormatVersion
肯尼斯·费舍尔(Kenneth Fisher)发表了一篇博客文章,介绍如何确定我的SSIS包是什么SQL版本?在2015年4月。 它具有一个表,该表将哪个SQL版本映射到PackageFormatVersionXML元数据中找到的哪个SSIS包。在查看1个单个包装时,此功能很有用。 我有一个大约100个SSIS .DTSX软件包的文件夹,我需要知道它们都是哪个SQL版本。 如何批量确定文件夹(文件系统)中PackageFormatVersion多个.DTSX软件包的版本(即SQL版本)? 最终目标是确定要获取并实施以将这些软件包放入其中的正确的TFS版本,因为当前不存在任何源代码控制系统。肯尼斯提出的表格将帮助我回答这个问题,但是首先我需要确认软件包的SQL版本是什么。 假设我没有安装BIDS或SSDT。 假设所需的输出是这样的,其中管道指定一个新列: PackageFilename | PackageFormatVersion -------------------------------------- Package1.dtsx | 3 Package2.dtsx | 4 欢迎使用PowerShell,TSQL,可以抓取目录结构的第三方工具或其他工具。

2
我可以从自引用(分层)表中获取树结构吗?
给定这样的层次表: CREATE TABLE [dbo].[btree] ( id INT PRIMARY KEY , parent_id INT REFERENCES [dbo].[btree] ([id]) , name NVARCHAR(20) ); 我想获得整个树结构。 例如,使用以下数据: INSERT INTO [btree] VALUES (1, null, '1 Root'); INSERT INTO [btree] VALUES (2, 1, '1.1 Group'); INSERT INTO [btree] VALUES (3, 1, '1.2 Group'); INSERT INTO [btree] VALUES (4, …

2
有没有一种方法可以使此选择通过一次查找来检索相同的结果?
通过修改查询或影响优化器的策略,是否可以通过一次查找或扫描检索与以下相同的数据? 与此类似的代码和架构目前在SQL Server 2014中。 复制脚本。设定: USE tempdb; GO IF OBJECT_ID('dbo.TestUpload', 'U') IS NOT NULL DROP TABLE dbo.TestUpload; CREATE TABLE dbo.TestUpload( JobRunId bigint NOT NULL, ThingAName nvarchar(255) NOT NULL, ThingAType nvarchar(255) NOT NULL, ThingAGranularity nvarchar(255) NOT NULL, ThingBName nvarchar(255) NOT NULL, ThingBType nvarchar(255) NOT NULL, ThingBGranularity nvarchar(255) NOT NULL ); CREATE …

2
多个存储过程中的相同代码
我最近加入一家公司,我只是注意到许多存储过程在整个过程中都重复了相同的代码部分。我注意到了,因为我的任务是在每个发生的SP中更改该代码的一小部分:) 这是相当庞大的代码块,大约30行。该代码是插入语句的一部分,它基本上将4个表连接在一起,而WHERE/AND条件实际上并没有真正从SP变为SP。它看起来类似于以下内容: ... ... FROM <TableOne> INNER JOIN <TableTwo> ON ... AND ..... AND ..... LEFT JOIN <TableThree> ON ... AND ..... AND ..... WHERE ..... AND ..... AND ..... AND MedicalPlanCode IN ('abc', 'def', 'ghi') 从SP更改为SP的唯一部分是值(“ abc”,“ def”,“ ghi”) 这些值的数量也可以不同,因此某些SP的值为2,其他SP的值为5,等等。 我想到的所有内容都将那部分代码更改为动态SQL,但不确定是否值得。但是,我里面的程序员讨厌这种情况。 我应该尝试实现某种形式的代码重用吗?有投资回报率吗?我有什么选择?我不得不经历大约100个存储过程,这花了大约一个小时。 100个SP分布在20个左右的不同数据库中。我确实具有创建视图的权限。

2
是否有T-SQL的标点符号等效项,例如[0-9]代表数字,[az]代表字母?
在T-SQL中是否存在[0-9]和[a-z]模式的等效项,可让我从包含标点的列中提取值? 例如: Create Table #Test ( Value VarChar(10) ) Insert Into #Test Values ('123a'), ('456b'), ('12ABC'),('AB!23'),('C?D789') Select * From #Test Where Value like '[0-9][0-9][0-9][a-z]' 这将返回值,其中前3个字符是介于0到9之间的数字,而最后一个字符将是介于a和z之间的字母,因此将返回123a,456b而不会返回12ABC。 我想知道标点符号是否等同于[0-9]数字和[a-z]字母,以便返回AB!23并返回C?D789? 如果我可以使用正则表达式,则可以使用该表达式^[a-zA-Z0-9]*$来匹配字符串中的字母数字字符。 Where Value like '^[a-zA-Z0-9]*$' 是否有等效的SQL? 我知道可以在RegEx中完成这种操作,但在T-SQL中需要它,因为我无法将任何自定义程序集加载到此服务器上,因此不能使用正则表达式。 实际列为varchar(200)。排序规则为Latin1_General_CI_AS。我正在使用SQL Server 2012 Standard Edition。

4
如何从存储过程完成之前获取响应?
我需要在完成之前从存储过程返回部分结果(作为简单选择)。 有可能这样做吗? 如果是,该怎么做? 如果没有,有什么解决方法? 编辑:我有该过程的几个部分。在第一部分中,我计算了几个字符串。我将在后面的过程中使用它们进行附加操作。问题是调用者需要尽快使用字符串。因此,我需要计算该字符串并将其传递回(以某种方式,例如通过选择),然后继续工作。调用方可以更快地获取其有价值的字符串。 呼叫者是一个Web服务。

1
选择按值均匀分布的分组数据
我想从一个表中选择4组数据,这些数据具有各组中值的总和,并且分布均匀。我确信我对它的解释不够清楚,所以我将尝试举一个例子。 在这里,我使用NTILE(4)创建4个组: SELECT Time, NTILE(4) OVER (ORDER BY Time DESC) AS N FROM TableX Time - N ------------- 10 - 1 9 - 2 8 - 3 7 - 4 6 - 1 5 - 2 4 - 3 3 - 4 2 - 1 1 - 2 为了简便起见,在上面的查询和结果中,其他列已被省略。 因此,您还可以看到以下组: …


3
更新WHERE子句以检查值是否不在单独的表中
我有一个使用WHERE子句的查询,并且碰巧在此表的许多查询中使用了完全相同的WHERE子句(等)。 查询是: SELECT DATENAME(DW, [AtDateTime]) AS [Day of Week] ,COUNT(*) AS [Number of Searches] ,CAST(CAST(COUNT(*) AS DECIMAL(10, 2)) / COUNT(DISTINCT CONVERT(DATE, [AtDateTime])) AS DECIMAL(10, 2)) AS [Average Searches per Day] ,SUM(CASE WHEN [NumFound] = 0 THEN 1 ELSE 0 END) AS [Number of Searches with no Results] ,CAST(CAST(SUM(CASE WHEN [NumFound] …

1
带有条件的唯一标识符字段
我有一个不在生产中的数据库,所以主表是CustodyDetails,此表有一个ID int IDENTITY(1,1) PRIMARY KEY列,我正在寻找一种添加另一个在其他任何表中都未引用的唯一标识符的方法。帐户列的内容将不完全是一个身份密钥。 这个新的身份列中有一些具体细节,这就是我的问题所在。格式如下:XX/YY其中XX是一个自动递增的值,它将在每个新年度重置/重新启动,而YY是本年度的后两位SELECT RIGHT(YEAR(GETDATE()), 2)。 因此,例如,让我们假设从2015年12月28 日至03/01/2016结束的一天添加了一条记录,该列将如下所示: ID ID2 DATE_ADDED 1 1/15 2015-12-28 2 2/15 2015-12-29 3 3/15 2015-12-30 4 4/15 2015-12-31 5 1/16 2016-01-01 6 2/16 2016-01-02 7 3/16 2016-01-03 我想到了使用前端来解析组合ID(示例中为ID2)以获取最后2位数字并与当年的最后2位数字进行比较,然后决定是否启动新的相关项。当然,能够在数据库端完成所有操作将是宏伟的。 编辑1:顺便说一句,我也看到人们使用单独的表只是为了存储并行的身份密钥,所以一个表的身份密钥成为第二个表的辅助密钥,这听起来有点狡猾,但也许是这样的实现到位的情况? 编辑2:此额外的 ID是旧文档参考,标记每个文件/记录。我猜想它可能是主ID的特殊别名。 在过去的20年中,该数据库每年处理的记录数没有超过100,并且极有可能(确实非常高),当然,如果超过99,该字段将能够继续使用多余的数字,前端/过程将能够超过99,因此它不会改变它。 当然,我一开始没有提到这些细节,因为它们只会缩小解决方案的可能性,以满足我的特定需求,并试图将问题范围扩大。

2
SQL Server 2008:每天重启的序列
我必须添加一个触发器,该触发器应使用以下格式字符串更新列:<current_date>_<per_day_incremental_id>,例如2015-10-01_36。ID必须是递增的,并且允许有空格。 我的方法很幼稚:用当前日期和当前序列值创建一个表,并在其中保留一条记录: create table DailySequence ( date date, sequence int ) insert into DailySequence values (getdate(), 1); CREATE TRIGGER MakeHumanReadableId ON dbo.AuditMeasures FOR INSERT AS DECLARE @ret int; DECLARE @tempDate date; DECLARE @nowDate date; SET @nowDate = getdate(); SELECT @ret = t.sequence, @tempDate = t.date from DailySequence as t; IF …

1
如何从以下查询中获取层次结构值?
我有一个名为的表Category,其中有一个名为的列CategoryID。同一张表中有一个引用列,称为fParentCategoryID。 我需要用逗号分隔所有类别ID及其子类别ID。例如-如果父类别ID为10,而父类别ID为20,则我打印类别ID 20时,我需要同时打印1和10作为其父,并以逗号分隔。 我尝试了以下查询,但我得到NULL了ParChild专栏。请帮忙。 ;WITH cteReports AS ( SELECT c.CategoryID, c.fParentCategoryID, [level] = 1, ParChild=cast(CAST(c.fParentCategoryID AS VARCHAR(200)) + ',' + CAST(c.CategoryID AS VARCHAR(200)) AS VARCHAR(MAX)) FROM retail.Category c WHERE c.fParentCategoryID is NULL UNION ALL SELECT c.CategoryID, c.fParentCategoryID, [level] + 1, ParChild = ParChild + ',' + CAST(c.CategoryID AS VARCHAR(200)) FROM …

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.