Intデータフィールドを先行ゼロ付きのnvarcharに変換する必要があります
例:
1「001」に変換
867は「000867」などに変換します。
どうも。
これは4時間後の私の応答です...
私はこのT-SQLスクリプトをテストし、うまく動作しました!
DECLARE @number1 INT, @number2 INT
SET @number1 = 1
SET @number2 = 867
SELECT RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 ) AS NUMBER_CONVERTED
SELECT RIGHT('000000' + CAST(@number2 AS NCHAR(6)), 6 ) AS NUMBER_CONVERTED
このユーザー関数を作成しました
T-SQLコード:
CREATE FUNCTION CIntToChar(@intVal BIGINT, @intLen Int) RETURNS nvarchar(20)
AS
BEGIN
-- BIGINT = 2^63-1 (9,223,372,036,854,775,807) Max size number
-- @intlen contains the string size to return
IF @intlen > 20
SET @intlen = 20
RETURN REPLICATE('0',@intLen-LEN(RTRIM(CONVERT(nvarchar(20),@intVal))))
+ CONVERT(nvarchar(20),@intVal)
END
例:
SELECT dbo.CIntToChar(867、6)AS COD_ID
出力
000867
これを試してください:select right('00000' + cast(Your_Field as varchar(5)), 5)
結果は5桁で取得されます(例:00001、....、01234)
SQL Server 2012で導入されたFORMAT()関数も使用できます。 http://technet.Microsoft.com/library/hh213505.aspx
DECLARE @number1 INT, @number2 INT
SET @number1 = 1
SET @number2 = 867
SELECT FORMAT(@number1, 'd10')
SELECT FORMAT(@number2, 'd10')
REPLICATE
を使用して、すべての先行ゼロをハードコーディングする必要がないようにします。
DECLARE @InputStr int
,@Size int
SELECT @InputStr=123
,@Size=10
PRINT REPLICATE('0',@Size-LEN(RTRIM(CONVERT(varchar(8000),@InputStr)))) + CONVERT(varchar(8000),@InputStr)
出力:
0000000123
この質問をハイジャックするのではなく、(N)CHARデータ型の代わりに(N)VARCHARを使用する必要があることに注意してください。
RIGHT('000' + CAST(@number1 AS NCHAR(3)), 3 )
上記のセグメントは、SQL 2005から正しい応答を生成しません
RIGHT('000' + CAST(@number1 AS NVARCHAR(3)), 3 )
上記のセグメントは、SQL 2005からの望ましい応答を生成します
Varcharは、必要なプレフィックス長をオンザフライで提供します。固定長のデータ型では、長さの指定と調整が必要になります。
使用したい
DECLARE @Length int
DECLARE @Number int
SET @Length = 9
SET @Number = 4
select right( POWER(10, @Length) + @Number, @Length)
これは私に与えます
000000004
データ型 "int"は10桁を超えることはできません。さらに、 "Len()"関数はintで機能するため、len()関数を呼び出す前にintを文字列に変換する必要はありません。
最後に、intのサイズ>埋め込みたい桁の合計数(@intLen)の場合を考慮していません。
したがって、より簡潔で正しい解決策は次のとおりです。
CREATE FUNCTION rf_f_CIntToChar(@intVal Int, @intLen Int) RETURNS nvarchar(10)
AS
BEGIN
IF @intlen > 20 SET @intlen = 20
IF @intlen < LEN(@intVal) RETURN RIGHT(CONVERT(nvarchar(10), @intVal), @intlen)
RETURN REPLICATE('0', @intLen - LEN(@intVal)) + CONVERT(nvarchar(10), @intVal)
END
SQL Server 2008以降の1行のソリューション(per se):
DECLARE @DesiredLenght INT = 20;
SELECT
CONCAT(
REPLICATE(
'0',
(@DesiredLenght-LEN([Column])) * (1+SIGN(@DesiredLenght-LEN([Column])) / 2) ),
[Column])
FROM Table;
SIGN
式による乗算は、MAX(0, @DesiredLenght-LEN([Column]))
と同等です。問題は、MAX()
が1つの引数しか受け入れないことです...
非常にエレガントではありませんが、変換したい数値に希望する先行ゼロと同じ数の設定値を追加し、RIGHT関数を使用します。
例:
SELECT RIGHT(CONVERT(CHAR(7),1000000 + @number2),6)
結果: '000867'
select right('000' + convert(varchar(3),id),3) from table
example
declare @i int
select @i =1
select right('000' + convert(varchar(3),@i),3)
ところで、それがint列の場合、それはまだゼロを保持しませんプレゼンテーション層でそれを行うか、本当にSELECTで必要な場合
私の場合、10文字のフィールド(NVARCHAR(10))にフィールドの先頭に0を付けたいと思いました。ソースファイルには、別のテーブルに結合するために必要な先頭の0がありません。これは、単にSQL Server 2008R2上にあるためでした。
Set Field = right(( '0000000000' + [Field])、10)(これはSQL2012より前であるためFormat()を使用できません)
これを既存のデータに対して実行しました。したがって、このように1または987654321は、10個すべてのスペースを先行0で埋めます。
新しいデータがインポートされ、Accessデータベースを介してテーブルにダンプされるため、新しいレコードのAccessからSQLサーバーテーブルに追加するときにFormat([Field]、 "0000000000")を使用できます。
良い記事を見つけました こちら :
先行ゼロを含む文字列のパディング
たとえば、数値列の長さが9文字で、先頭に0を付ける必要がある固定長のデータエクスポートを出力する場合、これを何度も行う必要があります。
同じ問題があった場合、これが私が解決した方法です...シンプルでエレガント。 「4」は、文字列の長さであり、整数の長さに関係なく、「4」までのゼロで埋められます。
STUFF(SomeVariableOrField,1,0,REPLICATE('0',4 - LEN(SomeVariableOrField)))
DECLARE @number1 INT, @number2 INT
SET @number1 = 1
SET @number2 = 867
-'RTRIM'がない場合、返される値は3__
です!!!
SELECT RIGHT('000' + RTRIM(CAST(@number1 AS NCHAR(3)), 3 )) AS NUMBER_CONVERTED
-'RTRIM'がない場合、返される値は867___
です!!!
SELECT RIGHT('000000' + RTRIM(CAST(@number2 AS NCHAR(6)), 6 )) AS NUMBER_CONVERTED
私のMYSQLでのこの作業:
FUNCTION leadingZero(format VARCHAR(255), num VARCHAR(255))
RETURNS varchar(255) CHARSET utf8
BEGIN
return CONCAT(SUBSTRING(format,1,LENGTH(format)-LENGTH(num)),num);
END
例えば:
leadingZero('000',999); returns '999'
leadingZero('0000',999); returns '0999'
leadingZero('xxxx',999); returns 'x999'
これが役立つことを願っています。宜しくお願いします
RIGHT
を使用することは良いオプションですが、次のこともできます。
SUBSTRING(CAST((POWER(10, N) + value) AS NVARCHAR(N + 1)), 2, N)
ここで、N
は、表示する合計桁数です。したがって、先行ゼロ(N = 3
)を含む3桁の値の場合:
SUBSTRING(CAST((POWER(10, 3) + value) AS NVARCHAR(4)), 2, 3)
または交互に
SUBSTRING(CAST(1000 + value) AS NVARCHAR(4)), 2, 3)
これは、必要な値を、十分な先行ゼロを生成するのに十分な大きさの10の累乗に加算してから、先行1を切り落とすことです。
この手法の利点は、結果が常に同じ長さになるため、一部のクエリ言語(HQLなど)では利用できないSUBSTRING
の代わりにRIGHT
を使用できることです。