首页 > 代码库 > 小技巧

小技巧

1.Float 转 varchar


前两天选择一个FLOAT型的字段,要转换为VARCHAR,可是小数点后面的都自动被删去了。。。后查得可以通过如下转换获得:

SELECT CAST(CAST(字段 AS DECIMAL(20,7)) AS VARCHAR(20)) FROM 要查的表
或者

SELECT CONVERT(VARCHAR(20),CONVERT(DECIMAL(20,7),字段)) FROM 要查的表

2.isdate 日起判断函数与nullif 前者等于后者则赋值 为null 连用

isdate(nullif([BadDebtTransferDate],‘‘))=0 
 
SELECT COUNT(*) FROM dbo.[_rawATB]
WHERE
ISDATE(nullif([BadDebtTransferDate],‘‘))=0
AND
BadDebtTransferDate!=0 and BadDebtTransferDate != ‘‘

3.用法新颖的values

select i from  ( values(1),(2),(3),(4),(5),(6)) t(i)
4.获取某月最后一天日期(到底是30 还是31)此算法实际上是前一个月加一个月再减去一天
DECLARE @PostDateID INT
set @PostDateID = (select cast(convert(varchar,
(select DATEADD(mm,-1,PostDate) from dbo.logImportInfo where ID =(select top 1 ImportInfo_ID from dbo.cvtTXNS_CHGS)),112) as int)/100)
PRINT @PostDateID
SELECT DATEADD(DAY,-1,DATEADD(mm,1,CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE)))
 
SELECT CAST(CONVERT(VARCHAR(20),GETDATE(),112) AS DATE)
 
DECLARE @PostDateID INT
set @PostDateID = (select cast(convert(varchar,
(select DATEADD(mm,-1,PostDate) from dbo.logImportInfo where ID =(select top 1 ImportInfo_ID from dbo.cvtTXNS_CHGS)),112) as int)/100)
PRINT @PostDateID-----
SELECT CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE),DATEADD(DAY,-1,DATEADD(mm,1,CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE)))
 

5.运用系统表查询列名,该列数据类型名,允许的长度

 
SELECT col.name,typ.name,typ.max_length FROM sys.all_columns col JOIN
     sys.types  typ ON col.system_type_id=typ.system_type_id
     WHERE col.object_id=object_id(‘cvtATB‘) AND col.name LIKE ‘%facility%‘
6.延时,定时技巧
a.延时三秒执行
waitfor delay ‘00:00:03‘
      select * from DimAccount
b.定时到这个时候执行
测试着玩:
alter  proc usp_intervalCall as
waitfor time ‘19:14:01‘
execute usp_ParseXMLFile
usp_intervalCall
 

7.Goto , Try catch

 
1.
比方说某库中有N个存储过程:
select name from sysobjects where xtype = ‘P‘;

name                                                                ------------------------------------------------------------------------------------------------------- 
SO_updateorderdetail
HR_ykf05p_calc
GL_uninit_comp_acct_must
……
……
(N row(s) affected)

那幺如何在不用光标不用循环的情况下用T-SQL语句将这个数据库中的所有存储过程删除?

2.
有一个字符串:  a,bc,d,abce,ddz
现在用T-SQL语句把这一字符串变成这种样子:
item       
---------- 
a
bc
d
abce
ddz

(5 row(s) affected)

(如果不用Cursor和循环,那幺有什幺好办法?)
 
第1题:
declare @v_sql varchar(8000)
set @v_sql = ‘ ‘                -- 这一句是必须的.
select @v_sql = @v_sql + ‘,‘ + name from sysobjects where xtype = ‘P‘
set @v_sql = ‘drop procdure ‘ + right(@v_sql,len(@v_sql)-1)--stuff(@v_sql,1,1,‘‘)替换逗号
print @v_sql
--exec (@v_sql)                        -- 这一句注释打开的话你就会把当前库中所有的存储过程删掉.

第2题:
declare @str varchar(20),@strSql varchar(8000)
set @str = ‘a,bc,d,abce,ddz‘        -- 此处的字符串可以随心所欲的更改
if object_id(‘tempdb.dbo.#temp1‘) is null
        create table #temp1(item varchar(20))
else
        truncate table #temp1
SELECT @strSql=‘insert into #temp1 values(‘‘‘+REPLACE(@str,‘,‘,‘‘‘) 
insert into #temp1 values(‘‘‘)+‘‘‘)‘
print @strSql
exec (@strSql)
select * from #temp1
 
在使用 row_number() 时候加上 with (no lock)
 


 

1.Float 转 varchar


前两天选择一个FLOAT型的字段,要转换为VARCHAR,可是小数点后面的都自动被删去了。。。后查得可以通过如下转换获得:

SELECT CAST(CAST(字段 AS DECIMAL(20,7)) AS VARCHAR(20)) FROM 要查的表
或者

SELECT CONVERT(VARCHAR(20),CONVERT(DECIMAL(20,7),字段)) FROM 要查的表

2.isdate 日起判断函数与nullif 前者等于后者则赋值 为null 连用

isdate(nullif([BadDebtTransferDate],‘‘))=0 
 
SELECT COUNT(*) FROM dbo.[_rawATB]
WHERE
ISDATE(nullif([BadDebtTransferDate],‘‘))=0
AND
BadDebtTransferDate!=0 and BadDebtTransferDate != ‘‘

3.用法新颖的values

select i from  ( values(1),(2),(3),(4),(5),(6)) t(i)
4.获取某月最后一天日期(到底是30 还是31)此算法实际上是前一个月加一个月再减去一天
DECLARE @PostDateID INT
set @PostDateID = (select cast(convert(varchar,
(select DATEADD(mm,-1,PostDate) from dbo.logImportInfo where ID =(select top 1 ImportInfo_ID from dbo.cvtTXNS_CHGS)),112) as int)/100)
PRINT @PostDateID
SELECT DATEADD(DAY,-1,DATEADD(mm,1,CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE)))
 
SELECT CAST(CONVERT(VARCHAR(20),GETDATE(),112) AS DATE)
 
DECLARE @PostDateID INT
set @PostDateID = (select cast(convert(varchar,
(select DATEADD(mm,-1,PostDate) from dbo.logImportInfo where ID =(select top 1 ImportInfo_ID from dbo.cvtTXNS_CHGS)),112) as int)/100)
PRINT @PostDateID-----
SELECT CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE),DATEADD(DAY,-1,DATEADD(mm,1,CAST(CAST(@PostDateID AS VARCHAR(20) )+‘01‘ AS DATE)))
 

5.运用系统表查询列名,该列数据类型名,允许的长度

 
SELECT col.name,typ.name,typ.max_length FROM sys.all_columns col JOIN
     sys.types  typ ON col.system_type_id=typ.system_type_id
     WHERE col.object_id=object_id(‘cvtATB‘) AND col.name LIKE ‘%facility%‘
6.延时,定时技巧
a.延时三秒执行
waitfor delay ‘00:00:03‘
      select * from DimAccount
b.定时到这个时候执行
测试着玩:
alter  proc usp_intervalCall as
waitfor time ‘19:14:01‘
execute usp_ParseXMLFile
usp_intervalCall
 

7.Goto , Try catch

 
1.
比方说某库中有N个存储过程:
select name from sysobjects where xtype = ‘P‘;

name                                                                ------------------------------------------------------------------------------------------------------- 
SO_updateorderdetail
HR_ykf05p_calc
GL_uninit_comp_acct_must
……
……
(N row(s) affected)

那幺如何在不用光标不用循环的情况下用T-SQL语句将这个数据库中的所有存储过程删除?

2.
有一个字符串:  a,bc,d,abce,ddz
现在用T-SQL语句把这一字符串变成这种样子:
item       
---------- 
a
bc
d
abce
ddz

(5 row(s) affected)

(如果不用Cursor和循环,那幺有什幺好办法?)
 
第1题:
declare @v_sql varchar(8000)
set @v_sql = ‘ ‘                -- 这一句是必须的.
select @v_sql = @v_sql + ‘,‘ + name from sysobjects where xtype = ‘P‘
set @v_sql = ‘drop procdure ‘ + right(@v_sql,len(@v_sql)-1)--stuff(@v_sql,1,1,‘‘)替换逗号
print @v_sql
--exec (@v_sql)                        -- 这一句注释打开的话你就会把当前库中所有的存储过程删掉.

第2题:
declare @str varchar(20),@strSql varchar(8000)
set @str = ‘a,bc,d,abce,ddz‘        -- 此处的字符串可以随心所欲的更改
if object_id(‘tempdb.dbo.#temp1‘) is null
        create table #temp1(item varchar(20))
else
        truncate table #temp1
SELECT @strSql=‘insert into #temp1 values(‘‘‘+REPLACE(@str,‘,‘,‘‘‘) 
insert into #temp1 values(‘‘‘)+‘‘‘)‘
print @strSql
exec (@strSql)
select * from #temp1
 
在使用 row_number() 时候加上 with (no lock)
 


 

小技巧