MSSQL判断一个数是否为整数,是否为小数,更新表所有列为NULL为空
[解决办法]
/*
一、有两个判断:
1.判断一个数是否为正整数
2.判断一个数是否为正小数(包含正整数,小数位数不限,只能包含数字和小数点)
都可包含0
(上面的简单描述为分别找出表某列为正整数,正小数的记录)
*/
select * from [表名]
where ([字段]>0 and [字段]%1.0=0) -- 正整数
and ([字段]>0) -- 正小数(包含正整数,小数位数不限,只能包含数字和小数点)
/*
二、一个表有多列,每列的每行都有可能是NULL(除主键),我现在要更新这个表中所有为NULL的为空('')
有什么好方法?
以前只知道一列一列判断更新,想知道有没有批量的方法,毕竟表多列多,一列一列要写N多语句。
*/
update [表名]
set [字段1]=isnull([字段1],''),
[字段2]=isnull([字段2],''),
[字段3]=isnull([字段3],''),
[字段4]=isnull([字段4],''),
.
.
.
IF object_id('tempdb..#temp') IS NOT NULL DROP TABLE #temp
go
CREATE TABLE #temp (id INT NOT NULL PRIMARY KEY, field1 FLOAT, field2 DECIMAL(10,2))
INSERT #temp
SELECT 1, 2.1, 10.8 UNION ALL
SELECT 2, 2.0, 10
--1.判断一个数是否为正整数
SELECT * FROM #temp
WHERE field1 >= 0 AND FLOOR(field1) = field1
--2.判断一个数是否为正小数(包含正整数,小数位数不限,只能包含数字和小数点
SELECT * FROM #temp
WHERE field1 >= 0 AND FLOOR(field1) <> field1
--#3.更新这个表中所有为NULL的为空
DECLARE
@tablename NVARCHAR(255),
@colname NVARCHAR(255),
@sql NVARCHAR(MAX)
DECLARE cursor_name CURSOR STATIC LOCAL FORWARD_ONLY READ_ONLY
FOR
SELECT
tablename = a.name,
colname = b.name
FROM sys.tables a
INNER JOIN sys.columns b
ON a.object_id = b.object_id
INNER JOIN sys.types c
ON b.user_type_id = c.user_type_id
WHERE a.name = 'a'
AND b.is_identity = 0--排除自增列
AND c.name IN('char','varchar','nchar','nvarchar', 'int')--这儿自己改,参考:SELECT DISTINCT name FROM sys.types
OPEN cursor_name
FETCH NEXT FROM cursor_name INTO @tablename, @colname
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @sql = 'update {1} set {2} = '''' where {2} is null'
SET @sql = REPLACE(@sql,'{1}',@tablename)
SET @sql = REPLACE(@sql,'{2}',@colname)
EXEC(@sql)
PRINT @sql
FETCH NEXT FROM cursor_name INTO @tablename, @colname
END
CLOSE cursor_name
DEALLOCATE cursor_name