标签: t-sql

如何判断我在通过 Windows 身份验证登录时使用了哪个 Windows 组登录名

我创建了两个对应于两个 Windows 组的 SQL Server 登录名:

MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)

然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。

在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccountMachineName\MyAppAmdin组中。

现在我可以通过 Windows 身份验证通过MyDomain\MyAccount.

问题是,我想确切地知道我正在使用哪个 Windows 组登录,但我不知道如何。

我试过:

ORIGINAL_LOGIN()
SYSTEM_USER
SUSER_SNAME
SELECT * FROM dm_exec_sessions
Run Code Online (Sandbox Code Playgroud)

以上所有内容都会返回MyDomain\MyAccount,但我需要知道的是我是否通过MachineName\MyAppAmdin.

总结一下,我的问题是:

有没有办法准确判断当前连接使用的是哪个 Windows 组登录(或用户)?

或者有什么方法可以检查是否MyDomain\MyAccount与特定用户或登录名相关联?

我知道我可以使用 C# 或命令来解析域帐户是否属于特定的 Windows 组,但是我们有一些新的 IT 策略,所以我正在考虑使用 TSQL 实现类似结果的方法。

security sql-server t-sql sql-server-2012 logins

6
推荐指数
1
解决办法
2555
查看次数

查找子组的最小值,过滤掉同一父组中前面的最小值

如何获取组(Acc、TranType)的最小值,但过滤掉 Acc 组前面行中使用的任何最小值。前面的行将定义为 Acc asc,TranType asc。

PosCancelID 应该只在每个 Acc 组出现一次。但是相同的 PosCancelID 可能出现在数据集中的另一个 Acc Group 中。

因此,对于给定的数据集:

Acc  | TranType | PosCancelID
100     1               2
808     1               5
808     1               4
808     2               5
808     2               4<--To be filtered from min calc as it min for (808,1)
813     2               3
813     4               3<--To be filtered from min calc as it min for (813,2)
809     1               3
809     1               4
809     2               3<--To be filtered from min calc as (809,1) uses it …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server-2016

6
推荐指数
1
解决办法
532
查看次数

将过滤索引放置在分区列上时,日期时间转换失败

在向表中插入新行时,我遇到了字符数据转换的神秘错误。故障排除表明过滤索引是问题的根源。

索引的过滤器使用 DateTime 列,该列也是表的分区列。一些客户端默认与俄语连接并收到错误消息。我设法在测试表上重现它。

有没有人对为什么会发生这种情况有任何想法?

use YOUR_DATABASE ;

go

select @@VERSION ;

-- Microsoft SQL Server 2016 (SP2-CU1) ...

-----------------------------------------------------------------------------

-- CREATE DATETIME PARTITIONED TABLE

set language english ;

drop table if exists dbo.test_of_filtered_idx ;

drop partition scheme ps_test_of_filtered_idx ;

drop partition function pf_test_of_filtered_idx ;

go



set language english ;

go

create partition function pf_test_of_filtered_idx (datetime)

   as range right 

   for values ('1999-11-01 00:00:00.000' , '1999-12-01 00:00:00.000' , '2000-01-01 00:00:00.000' , '2000-02-01 00:00:00.000')



create partition scheme ps_test_of_filtered_idx

  as partition pf_test_of_filtered_idx

  ALL …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql partitioning filtered-index

6
推荐指数
1
解决办法
656
查看次数

联机丛书中的自加入示例评论

在此处输入图片说明 在此示例中,它声明执行self-join,但它连接Sales.SalesPersonSales.SalesTerritory。我知道自连接意味着将同一张表连接到自己,但这里不是Sales.SalesPersonSales.SalesTerritory不同的表?那么,尽管表不同,这是否被认为是自连接?还是有错误?

来源链接

sql-server t-sql self-join

6
推荐指数
1
解决办法
310
查看次数

使用条件动态创建临时表

我正在尝试使用以下代码动态创建一个临时表,并且我知道我们不能为同一个表创建两个创建语句。是否有解决方法可以像下面的代码一样以有条件的方式放置它。

CREATE PROC test @var1 CHAR(1)
as
BEGIN
IF(@var1 = X)
BEGIN 
SELECT * INTO #result
FROM TABLE1
END
IF(@var1 = Y)
BEGIN 
SELECT * INTO #result
FROM TABLE2
END
IF(@var1 = Z)
BEGIN 
SELECT * INTO #result
FROM TABLE3
END

SELECT * FROM #result r
END
Run Code Online (Sandbox Code Playgroud)

目标是最终有一个名为 #result 的表,其中包含基于变量 (@var1) 值的列

编辑 1: 因为这是使用动态 SQL 的一个很好的候选者,如下所示,但我将无法使用#result动态 SQL 范围之外的表,而这正是我需要的。

CREATE PROC test @var1 CHAR(1)
as
BEGIN
-- USING  dynamic sql
DECLARE @sql VARCHAR(MAX)
IF(@var1 = 'X')
BEGIN 
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

6
推荐指数
2
解决办法
1万
查看次数

查询以查找给定范围内包含 ASCII 字符的行

我正在使用另一个主题的一些脚本,但接受的答案不适用于我的所有数据场景。我会问我关于如何检查非 Ascii 字符的原始帖子的问题,但我还没有足够的声誉来评论或投票。

问题:

我的测试

我使用示例数据、其中一个答案中的存储过程以及用于演示该问题的查询创建了SQL Fiddle

查询 1:sample_table

-- Note: The "bad dash" row has char(150)

SELECT * FROM sample_table;

+-------------------+
|    DataColumn     |
+-------------------+
| test - good dash  |
| test – bad dash   |
+-------------------+
Run Code Online (Sandbox Code Playgroud)

查询2:其它答案约翰表示“坏破折号”行含有炭(150):

SELECT dbo.Find_Invalid_Chars(DataColumn) [Invalid Characters]
FROM sample_table
WHERE dbo.Find_Invalid_Chars(DataColumn) IS NOT NULL;

+----------------------+
|  Invalid Characters  |
+----------------------+
| test [150] bad dash  |
+----------------------+
Run Code Online (Sandbox Code Playgroud)

查询3: …

sql-server collation t-sql character-set encoding

6
推荐指数
1
解决办法
3502
查看次数

多个join的SQL查询执行计划的逻辑顺序

我知道执行 SQL 查询的逻辑顺序是:

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
Run Code Online (Sandbox Code Playgroud)

如果查询中有多个连接会发生什么,例如,如果我们有这样的查询:

SELECT *
FROM user_branch T1
INNER JOIN dimcustomer2 T2
   ON T1.BRANCH_CODE = T2.BRANCH_CODE
INNER JOIN customer_guarantee T3
   ON T3.CUSTOMER_NUM = T2.CUSTOMER_NUM
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

customer_guarantee:    CUSTOMER_NUM      BRANCH_CODE
                      -------------------------------
                           A                X
                           B                X
                           C                Y
                           D                Z



 user_branch:           USER_ID          BRANCH_CODE    
                      --------------------------------
                           U1               Y



 dimcustomer2:         CUSTOMER_NUM      BRANCH_CODE      
                      --------------------------------
                           A                Y
                           B                Y
                           C                Y
                           D                Z
Run Code Online (Sandbox Code Playgroud)

这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。

query t-sql sql-server-2016

6
推荐指数
2
解决办法
3983
查看次数

寻找缺失的逆关系

我正在为一个我觉得应该很简单的查询而苦苦挣扎,但我无法理解它。

我们有一个单独的表来保存不同方之间的关系。该表应该为每个关系包含一行。然而,我们注意到一些关系缺失了,我们想重建它们。基本上每个关系应该有两行,关系和逆。

所以,一张健康的桌子应该是这样的……

Id | PartyId | OtherPartyId | RelType | RelStatus
1   1111      2211            1         1
2   2211      1111            1         1
3   3344      4444            1         2
4   4444      3344            1         2
Run Code Online (Sandbox Code Playgroud)

但是,我们有这样的情况......

Id | PartyId | OtherPartyId | RelType | RelStatus
1   1111      2211            1         1
2   2211      1111            1         1
3   3344      4444            1         2
4   5555      2224            1         2
5   2224      5555            1         2
Run Code Online (Sandbox Code Playgroud)

方 3344 和 4444 之间的逆关系缺失,所以我只想返回该行,以便我可以插入逆关系。

'id' 列是无关紧要的,因为它只是一个标识列,但 RelType 和 RelStatus 很重要,因为它们对于反向关系需要相同 - 例如,在 …

sql-server t-sql

6
推荐指数
2
解决办法
348
查看次数

选择包含 NULL 的前 x 行之后的所有行

我有桌子src。在此表中,每个产品-国家/地区组合可能包含NULLCountry第一行的列中x

如何为每个产品-国家/地区组合提供行,仅包含“国家/地区”列中包含的SELECT第一行之后的行?对于后面的任何行也很重要,即使它们确实包含在“国家/地区”列中,只要在其之前至少有一行具有真实值即可。xNULLSELECTNULL

预期输出

例如。

  1. 对于产品 A,我想要ID 为 3 和 4SELECT的行,而不是 ID 1 和 2 的行。
  2. 对于产品 B,我想要ID 为 6 和 7SELECT的行,而不是 ID 5 的行。
ID 产品 国家 时间戳
3 A 2022-01-23 14:29:06.830
4 A 无效的 2022-01-24 14:29:06.830
6 CH 2022-01-23 14:29:06.830
7 无效的 2022-01-24 14:29:06.830

示例表和数据

create table dbo.src
(
    ID int not null
    ,Product varchar(2) not …
Run Code Online (Sandbox Code Playgroud)

sql-server query t-sql

6
推荐指数
2
解决办法
930
查看次数

使用另一个表中的最大值和最小值更新 T-SQL

我对 SQL 查询没有太多经验,我正在尝试从错误中学习和理解。我有两张桌子:

CREATE TABLE #TempTest
(Id INT,
Number INT)

CREATE TABLE #TempTest2
(Id INT,
MaxNo INT,
MinNo INT)

INSERT INTO #TempTest VALUES (1,4)
INSERT INTO #TempTest VALUES (1,6)
INSERT INTO #TempTest VALUES (1,9)
INSERT INTO #TempTest VALUES (1,7)
INSERT INTO #TempTest VALUES (1,3)
INSERT INTO #TempTest VALUES (1,1)
INSERT INTO #TempTest VALUES (1,5)

INSERT INTO #TempTest2 VALUES (1,0,10)
Run Code Online (Sandbox Code Playgroud)

我正在尝试更新MaxNo第一个表中最大数小于 8 且MinNo最小数大于 1 的列:

UPDATE t2
SET MaxNo = IIF(t1.Number>t2.MaxNo AND t1.Number<8,t1.Number, t2.MaxNo),
MinNo = IIF(t1.Number<t2.MinNo …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql update

6
推荐指数
1
解决办法
3550
查看次数