我正在研究一个从活动目录中检索 objectGUID 的存储过程。我将结果存储在临时表中,然后在输出参数中返回值以供其他进程使用。SP 将从不同的存储过程以及 Web 应用程序 PHP、ASP Classic 和 ASP.Net 中调用。
我在这里读到(关于临时表):
如果在存储过程中创建,它们将在存储过程完成后销毁。此外,任何特定临时表的范围是创建它的会话;这意味着它只对当前用户可见。多个用户可以创建一个名为 #TableX 的临时表,同时运行的任何查询都不会相互影响——他们将保持自治事务,表将保持自治对象。您可能会注意到我的示例临时表名称以“#”符号开头。
听起来我很高兴,但我想得到一些建议,以确保没有任何我不知道的问题。这里是SP。
提前致谢。
CREATE PROCEDURE stp_adlookup
@user varchar(100),
@objectGUID varbinary(256) OUTPUT
AS
SET NOCOUNT ON;
DECLARE @qry char(1000)
CREATE TABLE #tmp(
objectGUID nvarchar(256)
)
SET @qry = 'SELECT *
FROM openquery(ADSI, ''
SELECT objectGUID
FROM ''''LDAP://mydomaincontroller.com''''
WHERE sAMAccountName = ''''' + @user + '''''
'')'
INSERT INTO #tmp
EXEC(@qry)
SELECT @objectGUID=CAST(objectGUID as varbinary(256)) FROM #tmp;
DROP TABLE #tmp
SET NOCOUNT OFF;
GO
Run Code Online (Sandbox Code Playgroud) 我遇到了这样的查询:
SELECT (SELECT COUNT(1) FROM Orders o WHERE i.ItemId = o.ItemId) [C]
FROM Items i
Run Code Online (Sandbox Code Playgroud)
我将其更改为以下
;WITH cte_count
AS
(
SELECT COUNT(1) c, OrderId FROM Orders Group By ItemId
)
SELECT a.c [Count], i.Name
FROM Items i
INNER JOIN cte_count c ON (c.ItemId = i.ItemId)
Run Code Online (Sandbox Code Playgroud)
但两者的执行计划如下所示:

同样,还有另一个查询选择TOP 1 Order By Id. 我尝试将这个移动到CROSS APPLY但是对于这个,我也得到了相同的执行计划。

当然,查询中还有其他连接和列。
我的困境是关于使用CROSS APPLYand 的实用性和优势CTE。有没有或只是异国情调?
我必须添加一个触发器,它应该使用以下格式字符串更新列:<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 @nowDate = @tempDate
BEGIN
SET @ret = @ret + 1;
UPDATE DailySequence
SET sequence = @ret;
END
ELSE
BEGIN
SET @ret = 0;
UPDATE …Run Code Online (Sandbox Code Playgroud) 我正在重命名一些独特的约束以匹配我们的数据库对象命名约定。奇怪的是,有几个多行表值函数返回的表具有唯一约束,如下所示:
CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result
TABLE
(
ID BIGINT PRIMARY KEY,
...
RowNum BIGINT UNIQUE
)
BEGIN
...
RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)
我尝试这样命名它,但不起作用:
CREATE FUNCTION [dbo].[fn_name] (...)
RETURNS @Result
TABLE
(
ID BIGINT PRIMARY KEY,
...
RowNum BIGINT
,CONSTRAINT UC_fn_name_RowNum UNIQUE([RowNum])
)
BEGIN
...
RETURN
END
GO
Run Code Online (Sandbox Code Playgroud)
当它是表变量函数定义的一部分时,是否可以设置唯一约束的名称?
t-sql sql-server-2012 set-returning-functions unique-constraint table-variable
我有一个不在生产中的数据库,所以主表是 CustodyDetails,这个表有一个ID int IDENTITY(1,1) PRIMARY KEY列,我正在寻找一种添加另一个唯一标识符的方法,它没有在任何其他表中引用,我认为通过将其纳入帐户列的内容不会完全是身份密钥。
不过,这个新的身份列有一些特定的细节,这就是我的问题开始的地方。格式如下:XX/YY其中XX是一个自动递增的值,它在每个新年重置/重新启动,YY是当前年份的最后 2 位数字SELECT RIGHT(YEAR(GETDATE()), 2)。
因此,例如让我们假设从28/12/2015开始到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
Run Code Online (Sandbox Code Playgroud)
我想到了用前端来解析复合ID(示例中为ID2)获取最后2位数字并与当前年份的最后2位数字进行比较,然后决定是否开始一个新的关联。当然,能够在数据库端完成这一切就太好了。
编辑 1:顺便说一句,我也看到人们使用单独的表来存储并行身份键,所以一个表身份键变成了第二个表辅助键,这听起来有点狡猾,但也许是这种实现的情况?
编辑 2:这个额外的ID 是一个旧文档引用,它标记每个文件/记录。我想人们可以将其视为主 ID 的特殊别名。
这个数据库每年处理的记录数量在过去 20 年里没有超过 100 条,而且非常(真的,非常高)不可能,当然,如果它超过 99 条,该领域将能够继续使用额外的数字,前端/过程将能够超过 99,所以它不会改变事情。
当然,其中一些细节我一开始没有提到,因为它们只会缩小解决方案的可能性以满足我的特定需求,试图使问题范围更广。
我有一个使用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] = 0 THEN 1 ELSE 0 END)
AS DECIMAL(10, 2)) / COUNT(*) AS DECIMAL(10, 4))
AS [Percent of Searches with no Results] …Run Code Online (Sandbox Code Playgroud) 我有这个查询来对结果进行分页,它在 SQL Server 2012 上运行良好。但是我不得不将我的数据库移动到 SQL Server 2008,现在我的存储过程不起作用。我做了一些研究,发现OFFSET它在 SQL Server 2008 中不起作用。我现在应该使用什么替代方案?我如何使用 SQL Server 2008 实现相同的功能?
这是我的存储过程:
CREATE PROCEDURE [dbo].[sp_JobSearch]
@EnteredKeyword nvarchar(200) = '',
@EnteredLocation nvarchar(200) = '',
@PageNumber INT = 1,
@PageSize INT = 40
AS
BEGIN
SELECT
MasterJob.Title, MasterJob.CompanyName,
MasterJob.ShortDesc, MasterJob.Url,MasterJob.PostedTime,
MasterJob.Location, JobBoard.JobBoardName
FROM
MasterJob
LEFT JOIN
JobBoard ON MasterJob.JobBoardId = JobBoard.JobBoardId
WHERE
(MasterJob.Title LIKE '%' + @EnteredKeyword + '%')
AND (MasterJob.Location LIKE '%' + @EnteredLocation + '%')
ORDER BY
[MasterJobId]
OFFSET @PageSize * (@PageNumber - …Run Code Online (Sandbox Code Playgroud) 是否有函数或关键字可以让我获取存储过程中的当前行号?
我知道有一个未公开的LineNo函数允许您设置行号,并影响系统错误消息的输出
/sf/ask/283815801/ - 字做
我知道有一个功能,ERROR_LINE()这是一个可用的内部BEGIN CATCH ... END CATCH。
ERROR_LINE()做我需要的,但我想从 CATCH 块之外使用它。文件中的任何位置。
DECLARE @InsertSource VARCHAR(1000) = object_name(@@procid)
EXEC PROC_Accounting_Transaction_Insert ... other parameters..., @InsertSource
Run Code Online (Sandbox Code Playgroud)
目前我只是硬编码调用#,因为它出现在存储过程主体中,但它很快就变老了。
DECLARE @InsertSource VARCHAR(1000)
SET @InsertSource = object_name(@@procid) + '#1'
EXEC ...
SET @InsertSource = object_name(@@procid) + '#2'
EXEC ...
Run Code Online (Sandbox Code Playgroud) 是否有与[0-9]和[a-z]模式等效的 T-SQL可以让我从包含标点符号的列中提取值?
例如:
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]'
Run Code Online (Sandbox Code Playgroud)
这将返回值,其中前 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]*$'
Run Code Online (Sandbox Code Playgroud)
是否有与此等效的 SQL?
我知道这种事情可以在 RegEx 中完成,但我需要在 T-SQL 中完成,我无法将任何自定义程序集加载到此服务器上,因此无法使用正则表达式。
真正的列是varchar(200)。归类是 Latin1_General_CI_AS。我使用的是 SQL Server 2012 标准版。
通过修改查询或影响优化器的策略,是否可以通过单个搜索或扫描来检索与以下相同的数据?
与此类似的代码和架构目前位于 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 CLUSTERED INDEX IX_JobRunId ON dbo.TestUpload (JobRunId);
GO
INSERT INTO dbo.TestUpload (JobRunId, ThingAName, ThingAType, ThingAGranularity, ThingBName, ThingBType, ThingBGranularity)
VALUES (1, 'A', 'B', 'C', 'D', 'E', 'F');
GO 10
INSERT …Run Code Online (Sandbox Code Playgroud) t-sql ×10
sql-server ×7
cross-apply ×1
cte ×1
paging ×1
primary-key ×1
sequence ×1
subquery ×1
where ×1