我们正在使用带有唯一标识符的 SQL Server 2012,我们注意到在执行选择时在末尾添加了额外的字符(所以不是 36 个字符),它仍然返回与 UUID 的匹配项。
例如:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8'
Run Code Online (Sandbox Code Playgroud)
返回带有 uuid 的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。
但是如果你运行:
select * from some_table where uuid = '7DA26ECB-D599-4469-91D4-F9136EC0B4E8EXTRACHARS'
Run Code Online (Sandbox Code Playgroud)
它还返回带有 uuid 的行7DA26ECB-D599-4469-91D4-F9136EC0B4E8。
SQL Server 在进行选择时似乎忽略了 36 以外的所有字符。这是错误/功能还是可以配置的东西?
这不是一个大问题,因为我们在前端验证了长度,但对我来说这似乎不是正确的行为。
为什么这样的事情不起作用?
SELECT
CASE
WHEN NULLIF(COL_LENGTH('Customers', 'Somecol'), '') IS NULL THEN NULL
ELSE Somecol
END AS MyTest
FROM Customers;
Run Code Online (Sandbox Code Playgroud)
我只是检查该列是否存在,但是,SQL Server 抱怨Somecol不存在。在单个语句中是否有替代方法?
我想知道为什么对于标量值函数,我必须授予用户执行而不仅仅是选择?
同时,表值函数只需选择权限或db_datareader成员资格即可正常工作。
更清楚的是,这里是我的示例:我需要一个对数据库具有只读权限的用户。所以我创建了一个名为的用户testUser并授予它db_datareader成员资格。然后我创建了一个名为fn_InlineTable. 一切都很棒。testUser整天运行这个 SQL
select * from dbo.fn_InlineTable
Run Code Online (Sandbox Code Playgroud)
然后我需要一个标量函数,所以我创建了一个名为fn_ScalarTest.
testUser无法运行此 SQL
Select dbo.fn_ScalarTest(1)
Run Code Online (Sandbox Code Playgroud)
很好理解:这是因为我没有授予“testUser”权限来执行fn_ScalarTest.
我的问题是:基于此链接/sf/ask/430562191/,表示 aFUNCTION不能用于执行修改数据库状态的操作. 那么为什么不让标量函数使用相同的“SELECT”权限而不是执行权限?
我希望我的问题是有道理的。谢谢你。
我有一个查询,它使用 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 = '?????????';
Run Code Online (Sandbox Code Playgroud)
top):
top):SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = …Run Code Online (Sandbox Code Playgroud) performance sql-server t-sql query-performance performance-tuning
我正在解开一些遗留代码,而且我多年来从未见过这个:
Select *
FROM GLAccounts
INNER JOIN GLCharts
ON glaGLChartID = glcGLChartID
LEFT JOIN GLCategories
ON glcGLCategoryID = gltGLCategoryID
INNER JOIN GLDepartments
ON glaGLDepartmentID = gldGLDepartmentID
INNER JOIN GLDivisions
ON glaGLDivisionID = glvGLDivisionID
,GLFiscalYearPeriods --<this comma>
INNER JOIN GLFiscalYears
ON glfGLFiscalYearID = glzGLFiscalYearID
ORDER BY glcGLCategoryID
,glcParentGLChartID
,glaGLChartID
Run Code Online (Sandbox Code Playgroud)
连接有效,但我没有在 ON 子句的任何 T-SQL 语法参考中找到逗号的这种用法。
这里发生了什么事?TIA
我有一些ALTER TABLE我正在运行的声明。并非所有这些都有效(它们是运行 SQL 数据比较的结果),我想将它们分组到一些事务中,并在出现问题时回滚语句。
这可能吗,还是只能回滚数据?
我们真的需要 C# 中的事务处理以及双方的数据库存储过程吗?
C#:
Using(transaction with transaction scope)
{
Execute stored proc;
Transaction. Complete;
}
Run Code Online (Sandbox Code Playgroud)
SQL存储过程:
Create process
As
Begin try
Begin transaction
Commit
End try
Begin catch
Rollback
End catch
Run Code Online (Sandbox Code Playgroud) 检查 VARCHAR 字段是否具有非 Ascii 字符的最佳方法是什么?
CHAR(1)通过CHAR(31)和CHAR(127)通过CHAR(255)。
我尝试使用PATINDEX并遇到了以下问题。
检查下范围是否正常工作。
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(1)+ '-' +CHAR(31)+']%',LINE_TEXT) > 0
Run Code Online (Sandbox Code Playgroud)
我的数据有 0x1E 的三个记录,并且所有三个都返回了。
但是当我只检查上限时:
SELECT *
FROM mbrnotes
WHERE PATINDEX('%[' + CHAR(127)+ '-' +CHAR(255)+']%',LINE_TEXT) > 0
Run Code Online (Sandbox Code Playgroud)
它返回接近表中的所有记录(表计数 170737 并返回计数 170735),并且由于我的数据在此范围内没有任何值,我认为它不应该返回任何记录。
这是一个装配树,我想使用递归T-SQL查询(大概CTE)和下面的预期结果进行搜索。我想知道给定任何零件的每个组件的总量。
这意味着如果我搜索“铆钉”,我想知道程序集中每个级别的总数,而不仅仅是直接子项计数。
Assembly (id:1)
|
|-Rivet
|-Rivet
|-SubAssembly (id:2)
| |
| |-Rivet
| |-Bolt
| |-Bolt
| |-SubSubAssembly (id:3)
| |
| |-Rivet
| |-Rivet
|
|-SubAssembly (id:4)
|-Rivet
|-Bolt
DESIRED Results
-------
ID, Count
1 , 6
2 , 3
3 , 2
4 , 1
Run Code Online (Sandbox Code Playgroud)
目前,我可以获得直接父母,但想知道如何扩展我的 CTE 以允许我向上滚动此信息。
With DirectParents AS(
--initialization
Select InstanceID, ParentID
From Instances i
Where i.Part = 'Rivet'
UNION ALL
--recursive execution
Select i.InstanceID, i.ParentID
From PartInstances i INNER …Run Code Online (Sandbox Code Playgroud) 列出作业、计划和下一次计划运行日期时间
我正在尝试列出作业、计划和下一个计划运行日期时间。但是,我似乎没有成功。
sysjobactivity 有 next_scheduled_run_date,这是我需要的,但我不知道将它连接到作业和计划。
如果有除 through 之外的方法sysjobactivity,请指导我。
SELECT
sj.name AS jobName
, ss.name AS scheduleName
, sja.next_scheduled_run_date
FROM msdb.dbo.sysjobs sj
INNER JOIN msdb.dbo.sysjobactivity sja ON sja.job_id = sj.job_id
INNER JOIN msdb.dbo.sysjobschedules sjs ON sjs.job_id = sja.job_id
INNER JOIN msdb.dbo.sysschedules ss ON ss.schedule_id = sjs.schedule_id
WHERE (sj.name LIKE 'xray%')
AND (sja.next_scheduled_run_date > GETDATE())
Run Code Online (Sandbox Code Playgroud) sql-server ×10
t-sql ×10
transaction ×2
ado.net ×1
c# ×1
cte ×1
functions ×1
join ×1
performance ×1
permissions ×1
recursive ×1
rollback ×1