小技巧
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和循环,那幺有什幺好办法?)
比方说某库中有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
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)
如果有来生,一个人去远行,看不同的风景,感受生命的活力。。。