Questions tagged «t-sql»

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


1
N'Șc'使用Latin1_General_CI_AS排序规则将N'C'的重复密钥视为
我有一个带有唯一键的表,该键包括一NVARCHAR(50)列(是否正确,但在那里)。因此,当尝试插入Șc或C(与插入顺序无关)时,由于排序规则问题,它在第二个插入处中断。这是错误: (受影响的1行)消息2601,级别14,状态1,行16无法在具有唯一索引'IX_TestT'的对象'dbo.testT'中插入重复的键行。重复的键值为(C)。 选择返回: 数据库默认排序规则为Latin1_General_CI_AS。花了一些时间研究如何解决该问题,而又没有太大改变现有的结构,但是找不到找到工作的方法。尝试了不同的排序规则和组合,一切都失败了。阅读(此处和此处)有关字符扩展等方面的信息,但仍然受阻。这是我用来复制问题的示例代码,可以随时进行修改并提出可以帮助解决此问题的任何建议。 CREATE TABLE testT ( [Default_Collation] [NVARCHAR] (50) COLLATE DATABASE_DEFAULT, [Latin1_General_CI_AS] [NVARCHAR] (50) COLLATE Latin1_General_CI_AS, [Latin1_General_CI_AI] [NVARCHAR] (50) COLLATE Latin1_General_CI_AI, [SQL_Collation] [NVARCHAR] (50) COLLATE SQL_Latin1_General_CP1_CI_AS); CREATE UNIQUE CLUSTERED INDEX [IX_TestT] ON [dbo].[testT] ([Default_Collation]) ON [PRIMARY] GO INSERT INTO testT SELECT N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', --COLLATE Latin1_General_CI_AS N'Șc', …

5
如何将case语句中的100个以上的条目作为变量
我编写了一个包含100多个选择的case语句,在一个简单的查询中,我在4个地方使用同一条语句。 相同的查询两次,并且它们之间有一个并集,但也进行计数,因此group by还包含case语句。 这是为了重新标记某些公司名称,其中同一公司的不同记录的拼写不同。 我试图将变量声明为VarChar(MAX) declare @CaseForAccountConsolidation varchar(max) SET @CaseForAccountConsolidation = 'CASE WHEN ac.accountName like ''AIR NEW Z%'' THEN ''AIR NEW ZEALAND'' WHEN ac.accountName LIKE ''AIR BP%'' THEN ''AIR BP'' WHEN ac.accountName LIKE ''ADDICTION ADVICE%'' THEN ''ADDICTION ADVICE'' WHEN ac.accountName LIKE ''AIA%'' THEN ''AIA'' ... 当我在select语句中使用它时-查询仅将case语句返回为文本,并且未对其进行评估。 我也无法在群组中使用它-我收到此错误消息: Each GROUP BY …

2
如何将HTML代码读取为XML并获得类似sql中示例的输出?
我将HTML代码存储在数据库中,我想将其读取为XML。 我的代码: http://rextester.com/RMEHO89992 这是我拥有的HTML代码的示例: <div> <section> <h4> <span> A </span> </h4> <ul> <li> <span> Ab</span> AD <span> AC </span> </li> <li> <span> Ag</span> <span> AL </span> </li> </ul> <h4> <span> B </span> </h4> <ul> <li> <span> Bb</span> BD <span> BC </span> </li> <li> <span> Bg</span> <span> BL </span> </li> </ul> …
11 sql-server  t-sql  xml 

4
可以参与SET操作的最大局部变量数是多少?
我有一个包含业务逻辑的存储过程。在它里面,我有大约1609个变量(不要问我为什么,这就是引擎的工作原理)。我尝试将SET一个变量转换为所有其他变量的串联值。结果是在创建过程中出现错误: 消息8631,级别17,状态1,过程XXX,行YYY内部错误:已达到服务器堆栈限制。请在查询中寻找潜在的深层嵌套,并尝试简化它。 我发现该错误是由于我需要在SET操作中使用的变量数量引起的。我可以将作业一分为二来执行。 我的问题是这方面有限制吗?我检查了一下,但是没有找到。 我们检查了此KB中描述的错误,但这不是我们的情况。我们CASE在代码内不使用任何表达式。我们使用该临时变量准备必须使用CLR函数替换的值的列表。我们将SQL Server更新为SP3 CU6(最新),但是仍然遇到该错误。

10
如何在标准SQL或T-SQL中生成1、2、3、3、2、1、1、2、3、3、2、1…系列?
给定两个数字n和m,我想生成一系列的表格 1, 2, ..., (n-1), n, n, (n-1), ... 2, 1 并重复m一次。 例如,对于n = 3和m = 4,我需要以下24个数字组成的序列: 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 ---------------- ---------------- ---------------- ---------------- 我知道如何通过两种方法之一在PostgreSQL中实现此结果: 使用以下查询,该查询使用该generate_series函数,以及一些技巧以确保顺序正确: WITH parameters (n, …

1
使用CEILING时,CASE表达式返回错误的值
我遇到了一个问题,就是CASE表达式无法返回我期望的结果。 作为测试,我添加了一个十进制变量并对它运行相同的CASE表达式,它运行良好,返回的结果与我期望的一样(将值四舍五入IsGun=1。但是当我CASE对另一个十进制值运行相同的表达式时,它总是返回CEILING()函数的值,并且永远不会返回原始值。 这是SQL代码: DECLARE @Num decimal(8,2); set @Num = 12.54; WITH PQ AS ( SELECT UPC, Price1, DBID, AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg FROM vProducts_PriceQty_Union ) SELECT PQ.UPC, PQ.Price1, PQ.Price1Avg, (CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar, CAST( (CASE WHEN P.IsGun = 1 …

4
格式为:YYYYNNNNNN的“ Id”,其中NNNNNN部分每年重新开始
我有一个业务需求,即发票表中的每个记录都有一个看起来像YYYYNNNNNN的ID。 NNNNNN部分需要在每年年初重新启动。因此,2016年输入的第一行看起来像2016000001,第二行看起来像2016000002等。假设2016年的最后一条记录是2016123456,下一行(2017年)应该看起来像2017000001 我不需要此ID作为主键,并且我也存储创建日期。这个想法是,这个“显示ID”是唯一的(因此我可以通过它查询),并且可以按年份分组。 任何记录都不太可能被删除;但是,我倾向于针对此类内容进行防御性编码。 有什么方法可以创建此ID,而不必在每次插入新行时都查询今年的最大ID? 想法: A CreateNewInvoiceSP,获得当年的MAX值(讨厌) 一些神奇的内置功能可以做到这一点(我可以梦到了) 能够在IDENTITYor DEFAULT声明(??)中指定一些UDF或其他内容 使用的视图PARTITION OVER + ROW()(被删除将是有问题的) 触发INSERT(仍然需要运行一些MAX查询:() 一年一次的后台工作,用每年插入的MAX来更新一张表格,然后我...有事吗? 所有这些都不理想。任何想法或变化都欢迎!
11 sql-server  t-sql 

1
在while循环中是否需要显式事务?
SQL Server 2014: 我们有一个非常大的表(一亿行),我们需要在表上更新几个字段。 对于日志传送等,显然,我们也希望将其保持在很小的规模上。 如果让下面的代码运行一段时间,然后取消/终止查询,那么到目前为止已完成的工作将全部提交吗,还是我们需要添加显式的BEGIN TRANSACTION / END TRANSACTION语句以便我们可以随时取消? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
无法镜像数据库SQL Server 2012
尝试使用以下命令镜像数据库时 ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ 我收到以下错误 消息1475,级别16,状态105,行1 数据库“ test0916aj8CJ”可能包含尚未备份的大容量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上启用数据库备份以恢复备份,或者在每个辅助数据库上还原该备份以将其加入可用性组。 可以不备份数据库就可以做到吗?还是应该备份然后放弃备份。它用于新创建的数据库,因此无论如何我现在都不需要备份。 我尝试了以下方法... BACKUP DATABASE [test0916aj8CJ] TO DISK = N’NUL’ WITH COPY_ONLY, NOFORMAT, INIT, NAME = N’test-Full Database Backup’, SKIP, NOREWIND, NOUNLOAD GO 但是上述方法也不起作用。 谢谢


1
将多个服务器登录名映射到一个数据库用户
这似乎是一个愚蠢的问题,但是尽管进行了一些研究,但我仍然无法找到与此有关的任何信息(可能是由于使用了错误的术语)。 是否可以将多个服务器登录名(SQL Server身份验证)记录到单个数据库用户(该用户具有作为数据库角色的成员所分配的权限)? 我有几十个sql登录名(sql服务器身份验证),它们需要从中央数据库读取一个设置,我宁愿将所有这些登录名映射到目标数据库中的单个DB用户,而不是为每个登录名创建一个自己的DB用户。 如果是,正确的T-SQL语法是什么?

4
某些用户查询缓慢
我从C#.NET Web应用程序中调用了几个查询,这些查询对我来说总是很快的(我是SQL Server上的本地管理员),但是对于一组用户(具有所需权限的域组)而言,查询速度却非常慢它在应用程序中超时的点。 是什么导致完全相同的查询针对不同的用户运行不同? 更多信息: 该查询是C#代码中的内联SQL,而不是存储过程 该应用程序使用域身份验证,用户和我自己都可以通过该应用程序运行查询 似乎问题出在不同的计划上,其中一个已被缓存,因此这对于不同的用户来说是不同的。某些因素正在影响缓存,因为现在通过应用程序查询对我来说很慢,而在SQL Server Management Studio中则很快。

2
从一个主作业顺序调用多个SQL Server Agent作业的好方法?
我有几个应顺序运行的SQL Server代理作业。为使应执行的作业保持良好的概览,我创建了一个主作业,该主作业通过调用来调用其他作业EXEC msdb.dbo.sp_start_job N'TEST1'。在sp_start_job瞬间完成(作业步骤1),但我想我的主要工作要等到工作TEST1已经调用下一个工作之前完成。 因此,我编写了这个小脚本,该脚本在作业被调用后立即开始执行(作业步骤2),并迫使主作业等待子作业完成: WHILE 1 = 1 BEGIN WAITFOR DELAY '00:05:00.000'; SELECT * INTO #jobs FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;', 'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'', @execution_status = 0, @job_aspect = N''JOB'''); IF NOT (EXISTS (SELECT top 1 * FROM #jobs)) BEGIN BREAK END; DROP TABLE #jobs; END; 这足够好用。但是我觉得WHILE 1 = …

5
在100mm记录上使用JOIN进行更新,如何做得更好?(在T-SQL中)
实际上,我需要更新单个表中的1亿条记录,通过用一个ID替换列的varchar值来规范化该表。(我说“替换”,但实际上我正在将ID写入另一列。) 我想要实现的是对数据集进行规范化。尚未规范化的数据没有索引。我的想法是,我不会在等待时在原始值上建立索引,而是在更新完成后索引将要用tinyint值替换varchar值的外键。 UPDATE A SET A.AutoClassID = B.AutoClassID FROM AutoDataImportStaging.dbo.Automobile as A JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName) 背景 在Server 2008 R2上使用MSSQL 2008 R2 服务器有8 GB RAM 服务器具有一个RAID10和7200 RPM SATA(我知道这不是很好,在生产中,它只能读取数据,而不能写入数据;加上最近的HD短缺使得这成为必需的成本) 服务器具有双四核Xeon CPU 机器没有做任何其他事情(当前专用于开发人员,仅此过程) 打开了简单的日志记录(?-但是它仍会记录下来以便可以回滚吗?) 请注意,该查询引用了两个不同的数据库,因此值得 表中要更新的记录的“宽度”为455字节 执行期间的资源 物理RAM已用完 磁盘I / O已用尽 CPU几乎什么也没做(扼要点是I / O) 运行时间已经有14个小时了! 我怀疑有些事情,例如我需要在原始数据上建立索引,即使在规范化更新后将删除列(AutoClassName)时也是如此。我还想知道是否应该一次循环遍历一个表而不是JOIN,这在我开始时似乎很荒谬,但现在看来它会更快。 如何为剩余的规范化更新(类似于此方法)更快地更改方法?

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.