Questions tagged «t-sql»

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

4
有没有一种方法可以在TSQL中生成表创建脚本?
有没有一种方法可以完全通过T-SQL从现有表中生成创建脚本(即不使用SMO,因为T-SQL无法访问SMO)。假设一个存储过程接收一个表名并返回一个包含给定表的创建脚本的字符串? 现在,让我描述一下我所面临的情况,因为可能有不同的方法来解决这个问题。我有一个包含数十个数据库的实例。这些数据库都具有相同的架构,所有相同的表,索引,等等。它们是作为第三方软件安装的一部分创建的。我需要一种与他们合作的方式,以便可以以临时方式汇总来自他们的数据。dba.se的好人已经在这里为我提供了帮助。如何在其他数据库中创建触发器? 当前,我需要找到一种从所有数据库的表中进行选择的方法。我已将所有数据库名称记录到一个名为的表中,Databasees并且编写了以下脚本以对所有数据库名称执行select语句: IF OBJECT_ID('tempdb..#tmp') IS NOT NULL DROP TABLE #tmp select * into #tmp from Database1.dbo.Table1 where 1=0 DECLARE @statement nvarchar(max) = N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1' DECLARE @LastDatabaseID INT SET @LastDatabaseID = 0 DECLARE @DatabaseNameToHandle varchar(60) DECLARE @DatabaseIDToHandle int SELECT TOP …

4
将结果限制在前2个排名行中
在SQL Server 2008中,我RANK() OVER (PARTITION BY Col2 ORDER BY Col3 DESC)用来返回带有的数据集RANK。但是我每个分区都有数百条记录,因此我将从1、2、3 ...... 999列中获取值。但我只希望RANKs每个最多2 个PARTITION。 例: ID Name Score Subject 1 Joe 100 Math 2 Jim 99 Math 3 Tim 98 Math 4 Joe 99 History 5 Jim 100 History 6 Tim 89 History 7 Joe 80 Geography 8 Tim 100 …

6
SQL Server注入-以26个字符为单位的损失是多少?
我正在测试针对SQL Server数据库上的注入攻击的弹性。 db中的所有表名都是小写,并且排序规则区分大小写,Latin1_General_CS_AS。 我可以发送的字符串被强制为大写,并且最大长度为26个字符。所以我不能发送DROP TABLE,因为表名将是大写的,因此由于排序规则,该语句将失败。 那么-我在26个角色中能造成的最大伤害是多少? 编辑 我了解有关参数化查询的所有知识,等等-假设在这种情况下,开发构建要发送查询的前端的人没有使用params。 我也不打算做任何邪恶的事情,这是由同一组织中的其他人构建的系统。


2
选择所有记录,如果存在联接,则与表A联接,如果不存在,则与表B联接
所以这是我的情况: 我正在为我的一个项目进行本地化,通常我会在C#代码中进行此操作,但是我想在SQL中进行更多操作,因为我想稍微弄点点SQL。 环境:SQL Server 2014 Standard,C#(.NET 4.5.1) 注意:编程语言本身应该无关紧要,为了完整起见,我仅将其包括在内。 所以我完成了我想要的,但是没有达到我想要的程度。自从我完成了JOIN除基本SQL 之外的任何SQL以来,已经有一段时间了(至少一年),这相当复杂JOIN。 这是数据库相关表的示意图。(还有更多,但是这部分不是必需的。) 映像中描述的所有关系都已在数据库中完成- PK和FK约束都已设置和运行。所描述的列均不null可用。所有表都具有架构dbo。 现在,我有一个查询这几乎做什么,我想:即给定任何的标识SupportCategories和任何的标识Languages,这将返回: 如果有合适的,正确的翻译是语言该字符串(即StringKeyId- > StringKeys.Id存在,并在LanguageStringTranslations StringKeyId,LanguageId以及StringTranslationId是否同时存在,那么它的负载StringTranslations.Text为StringTranslationId。 如果LanguageStringTranslations StringKeyId,LanguageId和StringTranslationId组合没有不存在,那么它加载的StringKeys.Name值。该Languages.Id是给定的integer。 我的查询很混乱,如下所示: SELECT CASE WHEN T.x IS NOT NULL THEN T.x ELSE (SELECT CASE WHEN dbo.StringTranslations.Text IS NULL THEN dbo.StringKeys.Name ELSE dbo.StringTranslations.Text END AS Result FROM dbo.SupportCategories INNER JOIN dbo.StringKeys ON …

4
在HashBytes函数中选择正确的算法
我们需要创建nvarchar数据的哈希值以进行比较。T-SQL中有多种可用的哈希算法,但是在这种情况下,哪一种是最好的选择? 我们要确保两个不同的nvarchar值具有重复哈希值的风险最小。根据我对互联网的研究,MD5似乎是最好的。那正确吗?MSDN向我们(下面的链接)介绍了可用的算法,但是没有说明在哪种条件下使用哪种算法? 哈希(Transact-SQL) 我们需要在两个nvarchar(max)列上联接两个表。可以想象,查询需要一段时间才能执行。我们认为最好保留每个nvarchar(max)数据的哈希值,然后对哈希值进行联接,而不是blob的nvarchar(max)值。问题是哪种哈希算法提供了唯一性,因此我们不会遇到为多个nvarchar(max)拥有一个哈希值的风险。

6
SQL Server是否支持GREATEST和LEAST,如果不是,通常的解决方法是什么?
回顾这个问题,似乎不需要做很多工作。他们正在尝试扩大日期范围。在其他数据库中,您只需使用greatest和least.. least(extendDate,min), greatest(extendDate,max) 当我尝试使用这些时,我得到 'least' is not a recognized built-in function name. 'greatest' is not a recognized built-in function name. 那将覆盖任一方向的延伸。 出于问题的目的,您仍然必须进行排他性范围替换。 我只是想知道SQL Server用户如何实现查询模式来模仿least和greatest功能化。 PostgreSQL GREATEST/LEAST MySQL的GREATEST/LEAST 玛丽亚数据库 GREATEST LEAST DB2 GREATEST LEAST 甲骨文 GREATEST LEAST 您是否将条件展开为CASE语句,或者是否有Microsoft的扩展程序,第三方加载项或许可证来启用此功能?

3
在选择中仍具有匹配附加字符的唯一标识符
我们正在使用带有唯一标识符的SQL Server 2012,并且我们注意到在进行选择时在末尾添加了其他字符(而不是36个字符)时,它仍然会返回与UUID的匹配项。 例如: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8' 返回带有uuid的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。 但是,如果您运行: select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS' 它还返回带有uuid的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。 选择SQL Server时,似乎会忽略除36个字符之外的所有字符。这是错误/功能还是可以配置的东西? 这不是一个大问题,因为我们在前端进行了长度验证,但对我来说似乎不是正确的行为。


5
创建计划指南以缓存(延迟假脱机)CTE结果
我通常会通过首先构造一个使用正确计划的查询,然后将其复制到不使用该计划的类似查询中来创建计划指南。但是,有时这很棘手,尤其是在查询不完全相同的情况下。从头开始创建计划指南的正确方法是什么? SQLKiwi提到了在SSIS中制定计划,是否有一种方法或有用的工具来帮助制定SQL Server的良好计划? 有问题的特定实例是以下CTE:SQLFiddle with cte(guid,other) as ( select newid(),1 union all select newid(),2 union all select newid(),3) select a.guid, a.other, b.guid guidb, b.other otherb from cte a cross join cte b order by a.other, b.other; 有没有任何方法来使结果拿出正好3个不同的guidS和没有更多?我希望将来能够通过将计划指南与CTE类型的查询一起使用来更好地回答问题,这些指南被多次引用以克服某些SQL Server CTE怪癖。
19 sql-server  t-sql  cte 


2
默认约束,值得吗?
我通常按​​照以下规则设计数据库: 除db_owner和sysadmin外,其他任何人都不能访问数据库表。 用户角色在应用程序层进行控制。我通常使用一个db角色来授予对视图,存储过程和函数的访问权限,但是在某些情况下,我添加了第二条规则来保护某些存储过程。 我使用TRIGGERS最初验证关键信息。 CREATE TRIGGER <TriggerName> ON <MyTable> [BEFORE | AFTER] INSERT AS IF EXISTS (SELECT 1 FROM inserted WHERE Field1 <> <some_initial_value> OR Field2 <> <other_initial_value>) BEGIN UPDATE MyTable SET Field1 = <some_initial_value>, Field2 = <other_initial_value> ... END DML使用存储过程执行: sp_MyTable_Insert(@Field1, @Field2, @Field3, ...); sp_MyTable_Delete(@Key1, @Key2, ...); sp_MyTable_Update(@Key1, @Key2, …

2
“ SELECT TOP”效果问题
我有一个查询,使用select可以运行得更快,top 100而没有则要慢得多top 100。返回的记录数为0。能否解释查询计划中的差异或在解释差异的地方共享链接? 没有top文本的查询: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 以上查询计划(不含top): https://pastebin.com/cbtJpxFf IO和TIME统计信息(无top): SQL Server parse and compile time: CPU time = 0 …

4
为什么我不能像我想象的那样在T-SQL中使用变量?
请原谅,我是一名开发人员,已经转移到SQL领域。我以为我可以通过添加变量来改进一些SQL,但它的功能不像我预期的那样。有人可以告诉我为什么这行不通吗?我不想变通,我想知道为什么此方法不起作用的原因,就像我想像的那样,因为我确信这是有充分的理由的,但是目前还没有跳出来。 DECLARE @DatabaseName varchar(150) SET @DatabaseName = 'MyAmazingDatabaseName' CREATE DATABASE @DatabaseName GO USE @DatabaseName GO

2
分页性能,可自定义排序数百万行
在我们的应用程序中,我们有一个网格,用户可以在该网格上翻阅大量记录(10-20百万)。网格支持在多列(20+)中以升序和降序排序。许多值也不是唯一的,因此该应用程序还按ID进行平局,以确保行始终出现在同一页面上。例如,如果用户要按小部件大小排序(从最大的开始),则应用程序将生成一个查询,看起来像这样: SELECT TOP 30 * -- (Pretend that there is a list of columns here) FROM Test -- WHERE widgetSize > 100 ORDER BY widgetSize DESC, id ASC 该查询需要大约15秒的时间来运行(使用缓存的数据),主要的花费似乎是根据widgetSize对130万行进行排序。为了调优该查询,我发现如果我添加一个WHERE仅限于最大的widgetSizes(在上面的查询中注释)的子句,查询仅需约800ms(所有前50,000个结果中的widget大小均大于100) 。 为什么没有WHERE子句的查询这么慢?我检查了widgetSize列上的统计信息,它们显示前739行的WidgetSize>506。由于仅需要30行,因此SQL Server不能使用此信息来推断它仅需要对具有窗口小部件大小的行进行排序哪个大? 我知道我可以通过在上添加索引来使此特定查询的执行更快widgetSize和id,但是该索引仅在此特定情况下有用,并且在(例如)用户反转排序方向时变得毫无用处。该表包含许多其他列,每个索引都很大(〜200mb),因此我真的负担不起为每种可能的排序顺序添加索引。 有什么方法可以使这些查询查询执行而无需为每个可能的排序顺序添加索引?(用户可以按20列以上的任意列进行排序) 以下脚本创建上表,并用一些代表性数据填充该表。该表比实际表要窄得多,但是仍然显示了我所看到的性能。在我的PC上,使用where子句的查询大约需要200毫秒,而没有where停顿的查询大约需要800毫秒。 警告:运行此脚本后生成的数据库大小约为2Gb。 CREATE TABLE Test ( id INT NOT NULL IDENTITY(1,1) PRIMARY KEY, widgetSize INT NOT …

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.