标签: t-sql

选择中仍然匹配额外字符的唯一标识符

我们正在使用带有唯一标识符的 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 以外的所有字符。这是错误/功能还是可以配置的东西?

这不是一个大问题,因为我们在前端验证了长度,但对我来说这似乎不是正确的行为。

sql-server t-sql sql-server-2012

18
推荐指数
3
解决办法
9743
查看次数

为什么我不能使用 CASE 语句来查看列是否存在而不是从中选择?

为什么这样的事情不起作用?

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不存在。在单个语句中是否有替代方法?

sql-server t-sql

18
推荐指数
2
解决办法
3万
查看次数

为什么标量值函数需要执行权限而不是选择?

我想知道为什么对于标量值函数,我必须授予用户执行而不仅仅是选择?

同时,表值函数只需选择权限或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”权限而不是执行权限?

我希望我的问题是有道理的。谢谢你。

sql-server permissions t-sql functions

18
推荐指数
2
解决办法
4万
查看次数

'SELECT TOP' 性能问题

我有一个查询,它使用 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):

https://pastebin.com/cbtJpxFf

在此处输入图片说明

IO 和 TIME 统计信息(没有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

18
推荐指数
2
解决办法
4978
查看次数

T-SQL 中奇怪的 JOIN ON 子句

我正在解开一些遗留代码,而且我多年来从未见过这个:

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

join sql-server t-sql

18
推荐指数
3
解决办法
1592
查看次数

我可以在事务中更改表结构,然后在出现错误时将其回滚吗?

我有一些ALTER TABLE我正在运行的声明。并非所有这些都有效(它们是运行 SQL 数据比较的结果),我想将它们分组到一些事务中,并在出现问题时回滚语句。

这可能吗,还是只能回滚数据?

sql-server t-sql transaction rollback

17
推荐指数
3
解决办法
3万
查看次数

我们是否需要在 C# 代码和存储过程中处理事务

我们真的需要 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)

sql-server ado.net t-sql transaction c#

17
推荐指数
1
解决办法
9994
查看次数

如何检查非 Ascii 字符

检查 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),并且由于我的数据在此范围内没有任何值,我认为它不应该返回任何记录。

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

17
推荐指数
2
解决办法
5万
查看次数

递归 CTE 以找到所有孩子的总数

这是一个装配树,我想使用递归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)

sql-server cte t-sql recursive

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

列出作业、计划和下一次计划运行日期时间

列出作业、计划和下一次计划运行日期时间

我正在尝试列出作业、计划和下一个计划运行日期时间。但是,我似乎没有成功。

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 t-sql sql-server-2012

17
推荐指数
2
解决办法
5万
查看次数