Questions tagged «t-sql»

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


2
如何从字符串中去除非数字字符?
用户在框中输入搜索词,然后将该值传递给存储过程,并对照数据库中的几个不同字段进行检查。这些字段并不总是具有相同的数据类型。 一个字段(电话号码)由所有数字组成,因此使用.Net CLR函数检查时会去除字符串中的所有非数字字符。 SELECT dbo.RegexReplace('(123)123-4567', '[^0-9]', '') 问题是,此函数有时突然停止工作,并出现以下错误: Msg 6533,第16级,状态49,第2行 AppDomain MyDBName.dbo [runtime] .1575已由升级策略卸载,以确保 您的应用程序的一致性。访问关键资源时发生内存不足。 System.Threading.ThreadAbortException:类型的异常 引发了“ System.Threading.ThreadAbortException”。 System.Threading.ThreadAbortException: 我已经尝试过针对此错误在MSDN上发布的建议,但仍然遇到问题。目前,我们无法选择切换到64位服务器。 我知道重新启动服务器会释放它所拥有的任何内存,但这在生产环境中不是可行的解决方案。 是否只有在使用T-SQL的SQL Server 2005中才能从字符串中去除非数字字符?

5
T SQL表值函数,以逗号分隔列
我在Microsoft SQL Server 2008中编写了一个表值函数,以数据库中的逗号分隔列为每个值吐出单独的行。 例如:“一,二,三,四”将返回一个只有一个包含以下值的列的新表: one two three four 你们这些代码看起来容易出错吗?当我用 SELECT * FROM utvf_Split('one,two,three,four',',') 它永远运行,永不返回任何东西。尤其是因为MSSQL服务器上没有内置的拆分功能(为什么为什么为什么?!),而我在网络上发现的所有类似功能都是绝对的垃圾,或者与我要执行的操作无关。 这是函数: USE *myDBname* GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER FUNCTION [dbo].[utvf_SPlit] (@String VARCHAR(MAX), @delimiter CHAR) RETURNS @SplitValues TABLE ( Asset_ID VARCHAR(MAX) NOT NULL ) AS BEGIN DECLARE @FoundIndex INT DECLARE @ReturnValue …

3
TSQL性能-最小和最大之间的值JOIN
我有两个表存储在其中: IP范围-国家/地区查询表 来自不同IP的请求列表 IP存储为,bigint以提高查找性能。 这是表结构: create table [dbo].[ip2country]( [begin_ip] [varchar](15) NOT NULL, [end_ip] [varchar](15) NOT NULL, [begin_num] [bigint] NOT NULL, [end_num] [bigint] NOT NULL, [IDCountry] [int] NULL, constraint [PK_ip2country] PRIMARY KEY CLUSTERED ( [begin_num] ASC, [end_num] ASC ) ) create table Request( Id int identity primary key, [Date] datetime, IP …

2
即使在创建存储过程时表存在,是否有办法强制延迟名称解析?
在SQL Server中创建存储过程时,可以引用不存在的表。但是,如果该表确实存在,则该过程中引用的任何列都必须存在于该表中(“ 延迟名称解析”)。 是否可以指示SQL Server推迟过程中引用的所有表的名称解析,而不管它们是否存在?我确实希望保留常规语法检查,因此即使有可能,也无法将存储过程定义修改到系统表中。 我希望我的要求看起来有些怪异,所以这里有一些背景知识:我会从用C#编写的应用程序中自动生成表定义和存储过程,并且我很难更改代码以根据SQL的需要对更改进行排序他们。我的代码“保证”架构在事务中是一致的,但是目前,我无法保证在定义引用它们的存储过程之前已定义表列。 下面是C#创建的SQL的规范示例,“说明”了我要解决的问题。 --Say this table already exists. CREATE TABLE myTable ( a NVARCHAR(MAX) ) GO --My C# code creates something like this BEGIN TRAN GO --the stored procedure gets generated first. CREATE PROCEDURE mySproc AS BEGIN SELECT a,b FROM myTable END --then the table update …

5
给定范围内的质数
最近,我被赋予打印所有质数(1-100)的任务。我在那里彻底失败了。我的代码: Create Procedure PrintPrimeNumbers @startnum int, @endnum int AS BEGIN Declare @a INT; Declare @i INT = 1 ( Select a = @startnum / 2; WHILE @i<@a BEGIN @startnum%(@a-@i) i=i+1; ) END 尽管我最终没有完成它,但我想知道在数据库(SQL Server 2008 R2)上执行这样的程序是否可行。 如果是,它将如何结束。

1
将数据加载到临时表中时获得最少的日志记录
即使在阅读了《数据加载性能指南》之后,我仍然不确定是否有必要将TABLOCK表提示添加到一个空的临时表中,该临时表由一个聚集索引定义,以便获得最少的日志记录。 显然,临时表是在TempDB中创建的,该表以SIMPLE恢复模式运行,因此我本以为它是最小化日志记录的理想选择,但是我找不到找到该表的方法。 临时表是否可以作为最少日志记录的候选表?如果这样,是否值得为永久表推荐添加TABLOCK提示?

2
Transact-SQL中的对称差异运算?
我一直都知道UNIONSQL中的运算符,但是直到最近才发现还有其他集合运算符,INTERSECT和EXCEPT。我还没有找到执行第四个大集合运算符的运算符,即对称差(例如的反函数INTERSECT)。 看起来我可以通过使用类似的东西来获得所需的输出 SELECT Field FROM A UNION SELECT Field FROM B EXCEPT SELECT Field FROM A INTERSECT SELECT Field FROM B (假设我的优先级正确),或通过执行反全联接: SELECT A.Field, B.Field FROM A FULL JOIN B ON B.Id = A.Id WHERE B.Id IS NULL OR A.Id IS NULL 但是,这两个查询看起来都很密集,特别是与其他三个基本集合操作相比。SQL中是否存在对称差异操作,而我只是在文档中找不到它?还是有在T-SQL中实现“规范”的方式?
10 sql-server  t-sql 

4
T-SQL-遍历表直到满足条件的最有效方法是什么
在中进行了编程任务T-SQL。 任务: 人们想进入电梯,每个人都有一定的体重。 排队等候的人的顺序由立柱转弯确定。 电梯的最大容量为<= 1000磅。 返回在电梯沉重之前能够进入电梯的最后一个人的名字! 返回类型应为表格 问题: 解决此问题的最有效方法是什么?如果循环正确,是否还有改进的空间? 我使用了一个循环和#临时表,这是我的解决方案: set rowcount 0 -- THE SOURCE TABLE "LINE" HAS THE SAME SCHEMA AS #RESULT AND #TEMP use Northwind go declare @sum int declare @curr int set @sum = 0 declare @id int IF OBJECT_ID('tempdb..#temp','u') IS NOT NULL DROP TABLE …
10 sql-server  t-sql 

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 这不起作用,我只是不知道如何处理第二部分(当输入不正确时)。

1
用于xml path('')输出
当我运行以下 select t.type from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 <type>Green</type> <type>Blue</type> <type>Red</type> 如果我运行以下 select t.type + '/' from (values ('Green'),('Blue'),('Red')) as t(type) for xml path('') 我收到此输出 Green/Blue/Red/ 为什么在select中添加串联会导致类型标签的删除和xml文件中一行的输出?运行SQL Server 2012。

3
如何在仅进行实际更改时触发T-SQL触发器?
我在UPDATE和INSERT上有一个表触发器,该触发器将行添加到另一个表中。如果更改了四列之一,则只需添加一行。我尝试使用IF UPDATE(col)来测试更改,但它有一个盲点。它仅测试是否引入了一些价值。我需要更深入地研究,我需要比较新旧价值,以查看是否发生了真正的变化。它必须同时使用INSERT和UPDATE。 在UPDATE的情况下很容易,因为插入和删除的表都具有我可以在触发器中比较的值。但是,对于INSERT,只有插入表具有值。因为我需要在同一触发器中完成所有操作,所以如何处理INSERT情况? 这是我要修改的触发器的脚本: ALTER TRIGGER [dbo].[trATPerson_alter] ON [mydb].[dbo].[AT_Person] AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; -- Not all updates require a push IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive])) BEGIN INSERT INTO [mydb].[dbo].[AT_Person_To_Push] ( [Facility], [VendorID], [Person_code], [First_Name], [Last_Name], [JobCode], [Alink], [Inactive] ) SELECT [Facility], [VendorID], [Person_code], [First_Name], …
9 t-sql  trigger 

3
为什么此查询缺少FROM子句而不出错?
因此,我们有一个带有带有错字的子查询的查询。它缺少FROM子句。但是,当您运行它时,它不会出错!为什么!? SELECT 1 ,r.id ,'0D4133BE-C1B5-4141-AFAD-B171A2CCCE56' ,GETDATE() ,1 ,'Y' ,'N' ,oldItem.can_view ,oldItem.can_update FROM Role r JOIN RoleObject oldReport ON r.customer_id = oldReport.customer_id JOIN RoleItem oldItem ON oldReport.id = oldItem.role_object_id AND r.id = oldItem.role_id WHERE r.id NOT IN (SELECT role_id WHERE role_object_id = '0D4133BE-C1B5-4141-AFAD-B171A2CCCE56') AND oldReport.id = '169BA22F-1614-4EBA-AF45-18E333C54C6C'

5
使用“ []”通配符将一个](右方括号)与PATINDEX匹配
我正在T-SQL †中编写自定义JSON解析器。 出于解析器的目的,我使用的PATINDEX功能是从标记列表中计算标记的位置。在我的情况下,标记都是单个字符,它们包括以下这些: {} []:, 通常,当我需要找到几个给定字符中任何一个的(第一个)位置时,我会使用如下PATINDEX函数: PATINDEX('%[abc]%', SourceString) 然后,该函数将为我提供aor b或or 的第一个位置c-两者中最先找到的那个SourceString。 现在,就我而言,问题似乎与]角色有关。一旦在字符列表中指定了它,例如: PATINDEX('%[[]{}:,]%', SourceString) 我的预期模式显然已损坏,因为该函数从未找到匹配项。看来我需要一种方法来转义第一个,]以便PATINDEX将其视为查找字符之一,而不是特殊符号。 我发现这个问题询问类似的问题: 需要LIKE运算符和方括号的帮助 但是,在那种情况下,]根本不需要在方括号中指定简单字符,因为它只是一个字符,可以在不带方括号的情况下进行指定。确实使用转义的替代解决方案仅针对LIKE而不适用PATINDEX,因为它使用了ESCAPE由前者而非后者支持的子句。 所以,我的问题是,有没有什么办法去寻找一个]与PATINDEX使用[ ]通配符?还是有一种方法可以使用其他Transact-SQL工具来模拟该功能? 附加信息 这是我需要PATINDEX与上述[…]模式一起使用的查询示例。这里的模式有效(尽管有点),因为它不包含]字符。我也需要使用它]: WITH data AS (SELECT CAST('{"f1":["v1","v2"],"f2":"v3"}' AS varchar(max)) AS ResponseJSON), parser AS ( SELECT Level = 1, OpenClose = 1, P = p.P, S = SUBSTRING(d.ResponseJSON, 1, NULLIF(p.P, 0) …

4
我可以在SET TRANSACTION ISOLATION LEVEL SERIALIZABLE之后添加提交的读取吗?
在存储过程中,我具有以下内容:(sql server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH 由于这是基于事务的,因此我认为其余的数据库连接将不受SERIALIZABLE的影响。 我是否需要隐式设置隔离级别以在提交后读取提交?这会对我的应用程序服务器和数据库服务器之间的其他连接产生不利影响吗?

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.