Значение по умолчанию для правой функции T-SQL - PullRequest
0 голосов
/ 03 сентября 2018

Я работаю над переносом функции доступа Right () на SQL Server.

Это функция доступа Вправо () :

Barcode: "ID" & (Right(String(8,"0") & [Job Number],8) & Right(String(6,"0") & 
[PART LIBARY HEADER_1]![PartID],6) & Right(String(6,"0") & [Part Assembly Link 
Table]![AssemblyLinkID],6))

Что делает вышеприведенное выражение, так это то, что оно динамически создает поле для размещения штрих-кода, длина которого всегда составляет 22 символа. Теперь значения этих штрих-кодов определяются другими столбцами. Я использую метод Right () , чтобы собрать самые правые: 8 символов номера задания, 6 символов PartID и 6 символов AssemblyLinkID.

Теперь проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу переместить эти значения в T-SQL, у меня возникают трудности с установкой значения по умолчанию равным = 0.

Например, следующий ввод:

Номер задания: 123456

PartID: 9876

AssemblyLinkID: 127

Нужно было бы вернуть… ID00123456009876000127

Функция String () в доступе обрабатывает для меня нулевые значения, добавляя 0 , но этот метод недоступен в SQL Server.

String(8,"0")

Это мой SQL-код:

Concat('ID', RIGHT(STR(0, 8) & [Job Number],8)) AS Barcode,

STR () - это не та функция, которую я хочу использовать, поскольку она не дает таких же результатов, как у MS Access String () .

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Вправо (строка (8, "0") & [номер задания], 8) =

RIGHT(REPLICATE('0', 8) + ISNULL([Job Number], ''), 8)
0 голосов
/ 03 сентября 2018

Это делает работу, которую вы хотите:

declare @t table ([Job NUmber] int, PartID int, AssemblyLinkID int)
insert into @t ([Job NUmber], PartID, AssemblyLinkID) values(123456,9876,127)

select
    'ID' + 
    RIGHT('00000000' + CONVERT(varchar(8),[Job Number]),8) +
    RIGHT('000000' + CONVERT(varchar(6),PartID),6) +
    RIGHT('000000' + CONVERT(varchar(6),AssemblyLinkID),6)
from @t

Вы можете использовать REPLICATE в качестве точного аналога для ваших STRING вызовов, но поскольку строковые литералы короче, чем вызов метода, я предпочитаю их.


Не совсем уверен, что ваша точка была около null с, но если какой-либо из этих столбцов может быть NULL, то вы также можете использовать COALESCE:

declare @t table ([Job NUmber] int, PartID int, AssemblyLinkID int)
insert into @t ([Job NUmber], PartID, AssemblyLinkID) values(123456,9876,127)
select
    'ID' + 
    RIGHT('00000000' + COALESCE(CONVERT(varchar(8),[Job Number]),''),8) +
    RIGHT('000000' + COALESCE(CONVERT(varchar(6),PartID),''),6) +
    RIGHT('000000' + COALESCE(CONVERT(varchar(6),AssemblyLinkID),''),6)
from @t

(Здесь мы получим все нули для значения NULL. Если вы хотите что-то другое, подставьте это в пустую строку в конце каждого выражения)

...