使用列中最长数据的长度设置子字符串长度

Che*_*eon 3 sql t-sql sql-server

我正在做一个子字符串来获取与某个费用代码匹配的所有电子邮件地址.由于我事先并不知道最大长度是什么,所以我总是使用太大的int,我想知道它是否会影响查询的性能.

我需要的是获取具有最长EmployeeEmails数据的行的长度并使用它设置@MAXINT

DECLARE @MAXINT INT = 2147483646

SELECT 
JOB.JOBNUMBER AS ExpenseCode,
substring(
    (
        Select ',' + LOWER(EMP.ELECTRONICMAILADDRESS) AS [text()]
        From dbo.EMPLOYEE EMP 
            INNER JOIN ITEM on ITEM.ACCESSLEVELNAME = JOB.ACCESSLEVELNAME
        Where LOWER(EMP.NAME2 + '.' + EMP.NAME3) Collate SQL_Latin1_General_CP1253_CI_AI = ITEM.NAMEOFUSER
            AND GETDATE() < CASE WHEN EMP.DATEENDEMPLOYMENT = '' THEN '2099-01-01' ELSE EMP.DATEENDEMPLOYMENT END
        ORDER BY EMP.ROWID
        For XML PATH ('')
    ), 2, @MAXINT) EmployeeEmails
FROM JOB
ORDER BY JOB.JOBNUMBER
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 5

不要SUBSTRING使用STUFF.而不是表达式:

SUBSTRING((SELECT...),2,2147483646)
Run Code Online (Sandbox Code Playgroud)

做:

STUFF((SELECT...),1,1,'')
Run Code Online (Sandbox Code Playgroud)

STUFF 通常用于从字符串离子SQL Server中剥离第一个字符.

  • @Cheon你知道你接受问题的答案会得到声望点吗?你应该试试看. (3认同)