Questions tagged «t-sql»

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

2
sp_msforeachdb在后台如何工作?
我需要解决我遇到的问题,并且需要一些帮助来了解sp_msforeachdb的工作方式以解决我的问题。 每次我运行sp_msforeachdb时,都会发生错误 Msg 102, Level 15, State 1, Incorrect syntax near '61' 我的代码示例如下: EXEC SP_msforeachdb 'SELECT ''?'' AS Database FROM ?.sys.objects WHERE name like ''%aetna%'' 但是,我将什么查询作为sp_msforeachdb的参数并不重要。每次我遇到相同的错误。我确实有一个以'61s1d'开头的数据库,所以我认为它的数据库名称有问题,但是老实说我不知道​​sp_msforeachdb的幕后情况。 注意事项。 它是唯一一个以数字开头的数据库 我可以尝试使用“如果数据库像'%61%'那样不要执行......”之类的代码,但是仍然会出现相同的错误。 我无法测试更改数据库名称的情况-与之连接的东西太多了。 如果我创建一个以“ 51”开头的测试数据库,那么我也会得到该数据库的错误 我该如何克服?

3
我是否应该仅出于PK目的将自动递增/ IDENTITY字段添加到交叉引用表中?
我将以下交叉引用表添加到我的SQL Server托管的数据库中: company_id bigint not null (FK) org_path nvarchar (2048) not null 该company_id字段引用id另一个表(其中是主键)中的字段。 假设还可以有多个具有相同记录的记录,则company_id任何主键都必须使用两个字段。但是,由于org_pathSQL Server太长,因此无法使用这两个字段创建密钥。 至于org_path,这是它存在的唯一表。对该表的查询极有可能会询问所有条目或的所有org_path条目company_id。或者换种说法,该表是否会被查询似乎令人怀疑org_path。此外,它不太可能org_path会被更新,更不可能被插入并且可能很少被删除。 我希望总行数可以低到几千。 另外,这nvarchar (2048)是因为该值必须模仿第三方数据库中的值。一个典型的例子是 \Translation Providers\[customer name]\[order name]\ 并可能包含变音符号。 所以我的问题是这样的:添加自动递增id字段并将其与company_id主键结合使用会更有效,还是会增加不必要的开销-并且company_id作为另一个表中主键的事实是否具有任何意义?效果在这里?

1
我们是否仍应使用QUOTENAME防止注入攻击?
我今天正在看一个旧的存储过程,发现它quotename在输入参数上使用了。经过一番挖掘以找出确切的功能后,我遇到了这个站点。我现在了解它的作用以及如何使用它,但是该网站称它被用作SQL注入攻击的缓解措施。当我过去使用asp.net开发直接查询数据库的应用程序时,我会使用ADO.Net参数将用户输入作为文字值传递,而从不真正担心在存储过程中对其进行保护。 我现在正在编写一个存储过程,该存储过程将由我不编写的应用程序使用,因此我需要在过程级别尝试防止注入攻击,这是quotename最好的方法,或者是否有更新的功能/更好的方法方法? 使我了解这种思维模式的代码(@parm1是用户输入参数): 'SELECT project [Project], project_desc [Description], customer [Customer], cpnyid [Company] FROM PJPROJ (nolock) where project like ' + quotename(@parm1,'''') + '

1
使用外键上的显式单键值克服MERGE JOIN(INDEX SCAN)
已添加7/11问题是在MERGE JOIN期间由于索引扫描而发生死锁。在这种情况下,一个事务试图在FK父表的整个索引上获得S锁,但是以前另一个事务将X锁置于索引的键值上。 让我从一个小例子开始(使用70-461 cource的TSQL2012 DB): CREATE TABLE [Sales].[Orders]( [orderid] [int] IDENTITY(1,1) NOT NULL, [custid] [int] NULL, [empid] [int] NOT NULL, [shipperid] [int] NOT NULL, ... ) 列[custid], [empid], [shipperid]是相应的相关参数[Sales].[Customers], [HR].[Employees], [Sales].[Shippers]。在每种情况下,我们在父母表中的引用列上都有一个聚集索引。 ALTER TABLE [Sales].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([custid]) REFERENCES [Sales].[Customers] ([custid]) ALTER TABLE [Sales].[Orders] WITH CHECK ADD …

1
使用xml参数更新多个数据时,如何避免使用合并查询?
我正在尝试使用值数组更新表。数组中的每个项目都包含与SQL Server数据库中的表中的一行相匹配的信息。如果表中已经存在该行,则使用给定数组中的信息更新该行。否则,我们在表中插入新行。我已经基本描述了upsert。 现在,我试图在采用XML参数的存储过程中实现这一目标。我使用XML而不是表值参数的原因是因为这样做,我将不得不在SQL中创建自定义类型并将该类型与存储过程相关联。如果我曾经更改过存储过程或数据库模式中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP优于XML的优势对我的情况没有用,因为我的数据数组大小永远不会超过1000。这意味着我无法使用此处提出的解决方案:如何在SQL Server 2008中使用XML插入多个记录 另外,这里的类似讨论(UPSERT-MERGE或@@ rowcount是否有更好的替代方法?)与我要的内容有所不同,因为我试图将多行插入表中。 我希望我可以简单地使用以下查询集从xml向上插入值。但这是行不通的。仅当输入为单行时,才应采用这种方法。 begin tran update table with (serializable) set select * from xml_param where key = @key if @@rowcount = 0 begin insert table (key, ...) values (@key,..) end commit tran 下一个替代方法是使用穷举的IF EXISTS或其以下形式的变体之一。但是,我以效率不佳为由拒绝了这一点: IF (SELECT COUNT ... ) > 0 UPDATE ELSE INSERT 下一个选择是使用Merge语句,如下所述:http …

2
如何用两个相关的“许多”表展平一个表的结果?
我已经对数据库中的某些表进行了重组,以使其更加灵活,但是我不确定如何编写SQL从中提取有意义的数据。 我有以下表格(为简洁起见,略有缩写): CREATE TABLE Loans( Id int, SchemaId int, LoanNumber nvarchar(100) ); CREATE TABLE SchemaFields( Id int, SchemaId int, FieldName nvarchar(255) ); CREATE TABLE LoanFields( Id int, LoanId int, SchemaFieldId int, FieldValue nvarchar(4000) ); 带有以下数据: INSERT INTO Loans (Id, SchemaId, LoanNumber) VALUES (1, 1, 'ABC123'); INSERT INTO SchemaFields (Id, SchemaId, …

1
sp_execute期望类型为'int'的参数'@handle'
我正在尝试检查存储过程,如果我的目标数据库中存在表。如果没有,那么我将使用源数据库中的information_schema表创建表。但是,当我使用sp_execute尝试并返回表(如果该表存在)时,会收到错误消息,过程期望类型为'int'的参数'@handle'。 我没有使用@handle参数。有人可以告诉我这个错误是什么意思,为什么我会收到它?我的代码的相关部分如下。 DECLARE @SQL NVARCHAR(MAX), @Parameters NVARCHAR(4000), @TableNotExists INT, @SourceTable NVARCHAR(200), @DestDB NVARCHAR(200) BEGIN SET @SourceTable = 'table' SET @DestDB = 'database' SET @Parameters = N'@SourceTableIN NVARCHAR(200), @TableNotExistsOut INT OUTPUT' SET @SQL = N'USE [' + @DestDB + '] IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = ''BASE …

1
元素名称变量
我有这个可以正常工作的tSQL代码: SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes('/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y")]') as a(b) 但是,我想做的是传递一个动态列表,该列表包含在每个值之间进行“或”运算的多对值,即 SELECT c.logguid, a.b.value('./PropertyValue', 'varchar(max)') asd FROM [dnn].[dbo].[EventLog2] c cross apply sss.nodes( '/LogProperties/LogProperty[PropertyName=sql:variable("@x") and PropertyValue=sql:variable("@y") or PropertyName=sql:variable("@a") and PropertyValue=sql:variable("@b") ]' ) as a(b) 有办法吗?
9 t-sql  xml 

6
选择具有相同ID但为null的行,并在该ID的另一列中选择其他值
我只想获得具有值NULL和某些值的行,而不是NULL特定的用户名列。 如果该特定用户名的两行均为null或均具有null以外的其他值,则该行不应出现在输出中。如果同一个用户名存在多于两行的null和其他值,则应显示它们。 以下是示例示例和输出。如何使用sql查询来完成? +----------+-------+ | username | col2 | +----------+-------+ | a | abc | | a | ef | | b | null | | b | null | | c | der | | c | null | +----------+-------+ 输出 +----------+------+ | username | col2 | +----------+------+ | …

2
如何检查空值或空表值参数?
我有一个存储过程(SS2k8),带有几个表值参数,有时会为null或为空。我看过这个StackOverflow帖子,其中指出应该从调用参数列表中省略空/空TVP。我的问题是我无法弄清楚如何在存储过程中检查空或空,因为“ IF(@tvp IS NULL)”在创建过程时失败,并显示消息“必须声明标量变量” @tvp”。我是否必须在TVP上执行SELECT COUNT(*)并检查零? 代码摘录: CREATE PROCEDURE [foo] (@tvp [TvpType] READONLY) AS IF (@tvp IS NOT NULL) -- doesn't work BEGIN -- lots of expensive processing END ELSE BEGIN -- a little bit of cheap processing END ...


2
如何检查统计信息的最后执行时间?
最近,我们的索引遇到了许多问题,我们的DBA团队将其归因于最近没有运行过的统计信息。这让我感到疑惑-如何检查统计信息是否最近通过SQL Management Studio更新了? 如果这个问题不能很好地解释这个问题,我深表歉意-直到现在,我才被引入统计数据,在此之前,只要遇到性能相关问题,它就会查找索引。 编辑: 我正在使用以下内容,但收到语法错误: use *databasename* exec sp_autostats *schema.tablename* 我收到的错误是: Msg 102, Level 15, State 1, Line 2 Incorrect syntax near '.'. 为什么是这样?

3
如何更快地获得最近行的总数?
我目前正在设计交易表。我意识到将需要计算每一行的运行总计,这可能会降低性能。因此,出于测试目的,我创建了一个包含一百万行的表。 CREATE TABLE [dbo].[Table_1]( [seq] [int] IDENTITY(1,1) NOT NULL, [value] [bigint] NOT NULL, CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED ( [seq] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO 我尝试获取10个最近的行及其运行总计,但大约花了10秒钟。 --1st attempt SELECT TOP 10 seq …

4
在案例陈述中退出查询?
我正在尝试设置一个查询,以便它将比较来自两个不同表的两个日期,如果它们相等,则查询退出。如果它们不相等,则查询将继续并插入一些内容。我不知道如何使它做我想要的。 SELECT TOP(1) @dateA=a.someDate FROM a ORDER BY DESC; SELECT TOP(1) @dateB=b.someDate FROM b ORDER BY DESC; CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log; Insert statements; 任何帮助将不胜感激。

3
根据特定公式找到最小的缺失元素
我需要能够从具有数千万行的表中找到丢失的元素,并且具有一BINARY(64)列的主键(这是要从中计算出的输入值)。这些值主要是按顺序插入的,但有时我想重复使用先前删除的值。用IsDeleted列修改已删除的记录是不可行的,因为有时会插入一行,该行的行数比当前现有行的数百万。这意味着样本数据将类似于: KeyCol : BINARY(64) 0x..000000000001 0x..000000000002 0x..FFFFFFFFFFFF 因此,在0x000000000002和之间插入所有缺少的值0xFFFFFFFFFFFF是不可行的,所用的时间和空间将是不希望的。本质上,当我运行算法时,我希望它返回0x000000000003,这是第一个开始。 我想出了一个用C#进行二进制搜索的算法,该算法将查询数据库中position处的每个值i,并测试是否期望该值。对于上下文,我的算法很糟糕:https : //codereview.stackexchange.com/questions/174498/binary-search-for-a-missing-or-default-value-by-a-given-formula 例如,此算法将在具有100,000,000个项目的表上运行26-27个SQL查询。(这似乎不是很多,但它的将要发生的非常频繁。)目前,这个表中有大约5000万行,并且表现越来越明显。 我的第一个替代想法是将其转换为存储过程,但这有其自身的障碍。(我必须编写一个BINARY(64) + BINARY(64)算法,以及许多其他东西。)这将很痛苦,但并非不可行。我也考虑过基于实施翻译算法ROW_NUMBER,但是对此我感到很不好。(BIGINT对于这些值,A 几乎不够大。) 我想提出其他建议,因为我真的需要尽快。值得的是,C#查询选择的唯一列是KeyCol,其他与该部分无关。 同样,就其价值而言,当前获取适当记录的查询大致如下: SELECT [KeyCol] FROM [Table] ORDER BY [KeyCol] ASC OFFSET <VALUE> ROWS FETCH FIRST 1 ROWS ONLY <VALUE>算法提供的索引在哪里。我也没有这个BIGINT问题OFFSET,但是我会的。(现在只有5000万行意味着它永远不会要求该值以上的索引,但是在某个时候它将超过该BIGINT范围。) 一些其他数据: 从删除来看,gap:sequential比率约为1:20; 表中的最后35,000行的值> BIGINT的最大值;

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.