我创建了两个对应于两个 Windows 组的 SQL Server 登录名:
MachineName\MyAppAmdin
MachineName\MyAppUser
Run Code Online (Sandbox Code Playgroud)
然后在数据库中,我创建了两个具有相同名称的用户并将它们映射到登录名。
在 Windows 服务器中,我将我的域帐户添加MyDomain\MyAccount到MachineName\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 实现类似结果的方法。
如何获取组(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) 在向表中插入新行时,我遇到了字符数据转换的神秘错误。故障排除表明过滤索引是问题的根源。
索引的过滤器使用 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) 我正在尝试使用以下代码动态创建一个临时表,并且我知道我们不能为同一个表创建两个创建语句。是否有解决方法可以像下面的代码一样以有条件的方式放置它。
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) 我正在使用另一个主题的一些脚本,但接受的答案不适用于我的所有数据场景。我会问我关于如何检查非 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)
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 查询的逻辑顺序是:
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)
这将如何执行?哪个连接会先执行?如果查询中有不同类型的连接怎么办?在这种情况下执行连接的顺序是什么?提前致谢。
我正在为一个我觉得应该很简单的查询而苦苦挣扎,但我无法理解它。
我们有一个单独的表来保存不同方之间的关系。该表应该为每个关系包含一行。然而,我们注意到一些关系缺失了,我们想重建它们。基本上每个关系应该有两行,关系和逆。
所以,一张健康的桌子应该是这样的……
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 很重要,因为它们对于反向关系需要相同 - 例如,在 …
我有桌子src。在此表中,每个产品-国家/地区组合可能包含NULL在Country第一行的列中x。
如何为每个产品-国家/地区组合提供行,仅包含“国家/地区”列中包含的SELECT第一行之后的行?对于后面的任何行也很重要,即使它们确实包含在“国家/地区”列中,只要在其之前至少有一行具有真实值即可。xNULLSELECTNULL
预期输出
例如。
SELECT的行,而不是 ID 1 和 2 的行。SELECT的行,而不是 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 查询没有太多经验,我正在尝试从错误中学习和理解。我有两张桌子:
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) t-sql ×10
sql-server ×8
query ×2
collation ×1
encoding ×1
logins ×1
partitioning ×1
security ×1
self-join ×1
update ×1