着力提醒:要求:需求扭转上边包车型地铁队列号,前半有个别是yyyymmdd格式的年月日岁月数字,后半有的则是每日都从1挨门逐户增加的数字,位数要一定,中间不足的补0

USE MASTER GO IF EXISTS(SELECT * FROM dbo.sysdatabases WHERE
name=’my_test_database’) DROP DATABASE [my_test_database] GO
CREATE DATABASE [my_test_database] GO USE [my_test_database] GO
CREATE TABLE [my_table] ([my_id] VARCHA宝马X3(16)State of Qatar GO –存储进度开端 :
CREATE PROCEDURE get_new_id @NEW_ID VARCHALX570(16State of Qatar OUTPUT AS BEGIN
DECLARE @DATE DATETIME DECLARE @YYYY VARCHAOdyssey(4卡塔尔国 DECLARE @MM VARCHA昂Cora(2State of QatarDECLARE @DD VARCHA宝马7系(2State of Qatar –保存获得的当前几日子 : SET @DATE = GETDATE(卡塔尔(قطر‎ SET
@YYYY = DATEPART(yyyy, @DATEState of Qatar SET @MM = DATEPART(mm, @DATE卡塔尔(قطر‎ SET @DD =
DATEPART(dd, @DATE卡塔尔 –位数远远不够的前边补0 SET @YYYY = REPLICATE(‘0’, 4 –
LEN(@YYYY卡塔尔(قطر‎State of Qatar + @YYYY SET @MM = REPLICATE(‘0’, 2 – LEN(@MM卡塔尔国卡塔尔(قطر‎ + @MM SET @DD
= REPLICATE(‘0′, 2 – LEN(@DD卡塔尔卡塔尔 + @DD –收取表中当明日子的已部分最大ID
SET @NEW_ID = NULL SELECT TOP 1 @NEW_ID = [my_id] FROM
[my_table] WHERE [my_id] LIKE @YYYY+@MM+@DD+’%’ ORDER BY
[my_id] DESC –假使未抽出来 IF @NEW_ID IS NULL
–表明还并未有当前几天期的数码,则直接从1方始编号 SET @NEW_ID =
(@YYYY+@MM+@DD+’00000001’State of Qatar –若是抽出来了 : ELSE BEGIN DECLARE @NUM
VARCHA奥德赛(8卡塔尔(قطر‎ –抽出最大的号码加上1 : SET @NUM = CONVERT(VARCHAHaval,
(CONVERT(INT, 劲客IGHT(@NEW_ID, 8卡塔尔国State of Qatar + 1卡塔尔国卡塔尔国–因为经过类型转变,错过了高位的0,须求补上 SET @NUM = REPLICATE(‘0’, 8

USE MASTER
GO
IF EXISTS(
       SELECT *
       FROM   sysobjects
       WHERE  [type] = ‘FN’ AND [name] = ‘kymp_日子转字符’
   )
BEGIN
    DROP FUNCTION kymp_时光转字符
END
GO
CREATE FUNCTION kymp_时间转字符
(
@date DATETIME, –时间
@type VARCHAR(10) –类型
)
RETURNS VARCHAR(4)
WITH ENCRYPTION
AS
BEGIN
DECLARE @retdate VARCHAR(4), @today DATETIME
SET @retdate = ”
SELECT @retdate = CASE RTRIM(LTRIM(@type))
                      WHEN ‘yy’ THEN CAST(YEAR(@date) AS VARCHAR(4)) –取年份
                      WHEN ‘mm’ THEN –取月份
                           CASE 
                                WHEN MONTH(@date) > 9 THEN CAST(MONTH(@date) AS VARCHAR(2))
                                ELSE ‘0’ + CAST(MONTH(@date) AS VARCHAR(2))
                           END
                      WHEN ‘dd’ THEN –取天数
                           CASE 
                                WHEN DAY(@date) > 9 THEN CAST(DAY(@date) AS VARCHAR(2))
                                ELSE ‘0’ + CAST(DAY(@date) AS VARCHAR(2))
                           END
                      WHEN ‘hh’ THEN –取小时
                           CASE 
                                WHEN DATEPART(hh, @date) > 9 THEN CAST(DATEPART(hh, @date) AS VARCHAR(2))
                                ELSE ‘0’ + CAST(DATEPART(hh, @date) AS VARCHAR(2))
                           END
                      WHEN ‘nn’ THEN –取分
                           CASE 
                                WHEN DATEPART(mi, @date) > 9 THEN CAST(DATEPART(mi, @date) AS VARCHAR(2))
                                ELSE ‘0’ + CAST(DATEPART(mi, @date) AS VARCHAR(2))
                           END
                      WHEN ‘ss’ THEN –取秒
                           CASE 
                                WHEN DATEPART(ss, @date) > 9 THEN CAST(DATEPART(ss, @date) AS VARCHAR(2))
                                ELSE ‘0’ + CAST(DATEPART(ss, @date) AS VARCHAR(2))
                           END
                      ELSE ”
                 END
RETURN @retdate
END
GO
–select dbo.kymp_时刻转字符(getdate(卡塔尔(قطر‎,’ss’State of Qatar
 
GO
IF EXISTS(
       SELECT *
       FROM   sysobjects
       WHERE  [type] = ‘P’ AND [name] = ‘database_backup’
   )
BEGIN
    DROP PROCEDURE database_backup
END
GO
CREATE PROCEDURE database_backup
@database VARCHAEvoque(1000State of Qatar, –要备份的数据库名称
@database_dir VARCHA君越(1000卡塔尔(قطر‎, –备份的目录路线
@ispassword INT, –是不是加密压缩文件 1:表示加密,0:表示不加密 默许不加密
@password VARCHAGL450(16卡塔尔国, –解压密码
@output VARCHA酷威(100卡塔尔 OUTPUT –重返结果
WITH ENCRYPTION
AS
DECLARE @datefile  NVARCHA本田CR-V(1000卡塔尔, — 备份数据库的人名:数据库名+时间
       @bakfile   NVARCHATiggo(1000卡塔尔(قطر‎, — 备份文件名  加.bak后缀
       @rarfile   NVARCHAWrangler(1000卡塔尔, — 压缩文件名 
       @rarcmd    NVARCHA牧马人(1000卡塔尔国 — shell字符命令
SELECT @database AS 数据库名称, @database_dir AS 备份路线, CASE @ispassword
                                                               WHEN 1 THEN 
                                                                    ‘加密’
                                                               WHEN 0 THEN 
                                                                    ‘不加密’
                                                          END AS 是或不是加密, 
      @password AS 压缩密码
/*    对各样参数的论断      */
— 决断数据库
IF (@database IS NULL) OR (@database = ”)
BEGIN
   SELECT @output = ‘备份战败:数据库无法为空’
   RETURN
END
— 决断数据库
—-   剖断密码
IF @ispassword IS NULL
BEGIN
   SET @ispassword = 0
END
ELSE 
IF @ispassword = 1 — 假使要加密文件,必得交给加密密码
BEGIN
   IF (@password IS NULL) OR (@password = ”)
   BEGIN
       SET @output = ‘备份战败:就算要给减弱的备份文件加密,密码不能够为空’
       RETURN
   END
END
—-   判别密码
—- 剖断路径
IF (@database_dir IS NULL) OR (@database_dir = ”)
BEGIN
   SET @output = ‘备份战败:备份文件路线无法为空’
   RETURN
END
—- 判定路线
/*    对一一参数的决断      */
IF EXISTS(
      SELECT *
      FROM   sysdatabases
      WHERE  [name] = @database
  )
BEGIN
   /*  文件夹路线推断   */
   SET @rarcmd = ‘dir ‘ + @database_dir
   CREATE TABLE #t
   (
    [output] VARCHAR(100)
   )
   INSERT INTO #t
   EXEC xp_cmdshell @rarcmd — 履行cmdshell命令,查找路线并把结果插入#t表
   IF EXISTS(
          SELECT *
          FROM   #t
          WHERE  [output] LIKE ‘%找不到%’
      State of Qatar–找不到路线就创办路径
   BEGIN
       SET @rarcmd = ‘md ‘ + @database_dir
       EXEC xp_cmdshell @rarcmd — 施行cmdshell命令,创设路径
   END
   
   SET @rarcmd = ‘dir ‘ + @database_dir —- 再度推断文件路线是还是不是成立成功(成功的渠道无法在系统路线中卡塔尔(قطر‎
   DELETE #t
   INSERT INTO #t
   EXEC xp_cmdshell @rarcmd — 试行命令
   IF EXISTS(
          SELECT *
          FROM   #t — 备份路线不可能在系统路线中
          WHERE  ([output] LIKE ‘%找不到%’) OR ([output] LIKE ‘%system32%’)
      )
   BEGIN
       DROP TABLE #t
       SET @output = ‘备份退步:传入的文件夹路线不对’
       RETURN
   END
   
   DROP TABLE #t
   /*  文件夹路线推断   */
   /*   备份模块    select getdate(State of Qatar*/
   –备份文件名  数据库名+系统当下岁月+.bak
   SET @datefile = @database + ‘_backup_’ + dbo.kymp_时刻转字符(GETDATE(State of Qatar, ‘yy’卡塔尔(قطر‎
       + dbo.kymp_时光转字符(GETDATE(State of Qatar, ‘mm’卡塔尔国 + dbo.kymp_时间转字符(GETDATE(卡塔尔国, ‘dd’卡塔尔
       + dbo.kymp_光阴转字符(GETDATE(卡塔尔国, ‘hh’卡塔尔 + dbo.kymp_岁月转字符(GETDATE(卡塔尔(قطر‎, ‘nn’卡塔尔(قطر‎
       + dbo.kymp_时刻转字符(GETDATE(卡塔尔, ‘ss’卡塔尔国
   
   SET @bakfile = @database_dir + @datefile + ‘.bak’
   SET @rarfile = @database_dir + ” + @datefile + ‘.rar’ — 压缩的rar文件
   BACKUP DATABASE @database TO DISK = @bakfile WITH INIT , NOUNLOAD , NAME 
   = N’H普拉多数据备份’, NOSKIP , STATS = 10, NOFORMAT
   IF @ispassword = 1 —  rar加密管理
   BEGIN
       SET @rarcmd = ‘C:\Progra1\WinRAR\WinRAR.exe a  -p’ + @password + 
           ‘ -df -ep1 ‘ + @rarfile + ‘ ‘ + @bakfile
       
       SET @output = ‘备份成功:已加密压缩备份文件,密码是:’ + @password
   END
   ELSE 
   IF @ispassword = 0 — rar不加密管理
   BEGIN
       SET @output = ‘备份成功:以不加密的措施缩小了备份文件’
       SET @rarcmd = ‘C:\progra1\WinRAR\WinRAR.exe a  -df -ep1 ‘ + @rarfile
           + ‘ ‘ + @bakfile
   END
   /*  备份模块  */
   EXEC MASTER..xp_cmdshell @rarcmd –实行cmdshell命令,压缩备份文件
END
ELSE
BEGIN
   SELECT @output = ‘备份失利:未有那一个数据库’
END
GO
DECLARE @rt VARCHAR(100)
EXEC database_backup ‘QQ_data’, ‘D:1\’, 1, ‘2’, @rt OUTPUT
SELECT @rt AS 施行结果
GO
–sp_helptext database_backup
 

要求:须求扭转下面包车型客车行列号,前半部分是yyyymmdd格式的年月日时刻数字,后半某个则是每天都从1各样增进的数字,位数要定点,中间不足的补0。
在SQL Server 2002数据库中测量试验后经过如下代码,作用完成如下:

  • LEN(@NUMState of Qatar卡塔尔(قطر‎ + @NUM –最终回到日期加编号 : SET @NEW_ID = @YYYY+@MM+@DD
  • @NUM END END GO –推行二十五回调用及插入数据测量试验 : DECLARE @N INT SET @N
    = 0 WHILE @N 20 BEGIN DECLARE @NEW_ID VARCHAR(16) EXECUTE get_new_id
    @NEW_ID OUTPUT INSERT INTO [my_table] ([my_id]) VALUES (@NEW_ID)
    SET @N = @N + 1 END SELECT * FROM [my_table] GO –输出结果

USE MASTER

GO

IF EXISTS(SELECT * FROM dbo.sysdatabases WHERE name=my_test_database)

DROP DATABASE [my_test_database]

GO

CREATE DATABASE [my_test_database]

GO

USE [my_test_database]

GO

CREATE TABLE [my_table] ([my_id] VARCHAR(16))

GO

–存款和储蓄进度最初

CREATE PROCEDURE get_new_id

@NEW_ID VARCHAR(16) OUTPUT

AS

BEGIN

DECLARE @DATE DATETIME

DECLARE @YYYY VARCHAR(4)

DECLARE @MM VARCHAR(2)

DECLARE @DD VARCHAR(2)

–保存得到的眼后天子

SET @DATE = GETDATE()

SET @YYYY = DATEPART(yyyy, @DATE)

SET @MM = DATEPART(mm, @DATE)

SET @DD = DATEPART(dd, @DATE)

–位数相当不足的眼下补0

SET @YYYY = REPLICATE(0, 4 – LEN(@YYYY)) + @YYYY

SET @MM = REPLICATE(0, 2 – LEN(@MM)) + @MM

SET @DD = REPLICATE(0, 2 – LEN(@DD)) + @DD

–抽出表中当今天期的已部分最大ID

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注