sql定义一个double变量怎么定义?

说白了,这段代码试图将一个浮点数转换为固定小数位数的Decimal类型。
其实很简单,但是有几个关键点需要注意。

先说最重要的,CAST函数的使用是对的,但你的Decimal类型指定有误。
在SQL Server中,Decimal类型的语法是DECIMAL(p, s),其中p是总位数,s是小数点后的位数。
你指定的是DECIMAL(3 8 , 3 ),这意味着你打算有一个3 8 位的数字,其中3 位是小数,这实际上是不合理的,因为小数部分最多只能有3 8
1 = 3 7 位数字。

另外一点,你的原始数值是1 2 3 .1 2 3 6 5 6 ,它有6 位小数。
如果你只想保留3 位小数,那么应该将Decimal类型设置为DECIMAL(8 , 3 ),因为1 2 3 .1 2 3 6 5 6 在保留3 位小数后变成了1 2 3 .1 2 3 ,总共占用8 位数字(包括小数点)。

还有个细节挺关键的,你的数值转换后可能会有精度损失,因为Decimal类型不支持所有浮点数到固定小数的精确转换。
如果你在转换过程中遇到这个问题,可能需要重新考虑是否真的需要使用Decimal类型,或者接受一定的精度损失。

最后,你的代码是正确的,只是参数需要调整。
你可以这样写:
sql DECLARE @abc DECIMAL(8 , 3 ) = CAST(1 2 3 .1 2 3 6 5 6 AS DECIMAL(8 , 3 )) PRINT @abc
这样,你的输出就会是1 2 3 .1 2 3
我一开始也以为直接使用CAST(1 2 3 .1 2 3 6 5 6 AS decimal(3 8 , 3 ))就能解决问题,后来发现不对,Decimal类型的参数需要仔细设置。
等等,还有个事,如果你的数值转换后的小数位数超过了你指定的小数位数,SQL Server会四舍五入,所以确保你的数值在小数位数上不超过你指定的位数是很重要的。

SQL变量声明怎么写 变量声明的2种语法解析

哈喽~ 你在搞SQL变量声明是吧?这个确实挺重要的,不然写出来的代码一堆乱七八糟的。
我给你总结下我踩过的坑和比较好的做法哈。

上周有个客人问我MySQL和SQL Server的变量怎么用的时候,我就想起这些了。
别看声明很简单,但用不好会出大问题。

SQL Server和Oracle用DECLARE关键字
这是最常见的一种,特别是SQL Server,你声明变量必须带@符号,这个我去年在一个项目中差点忘记,硬是跑了好几天bug才找出来。

sql DECLARE @Counter INT = 0; DECLARE @Message VARCHAR(2 5 5 ); SET @Message = 'Hello, SQL!'; SELECT @Counter, @Message;
Oracle的PL/SQL稍微有点不一样,不需要@符号,但写法类似:
sql DECLARE counter INTEGER := 0; message VARCHAR2 (2 5 5 ); BEGIN message := 'Hello, PL/SQL!'; DBMS_OUTPUT.PUT_LINE(counter || '' || message); END;
MySQL用SET关键字
这个我经常用,因为MySQL的SET特别简单,直接赋值就行,不用声明类型,它会自己猜。

sql SET @user_count = (SELECT COUNT() FROM users); SET @message = 'Total users: '; SELECT @message, @user_count;
我之前在一个电商项目里用这个,一开始用DECLARE声明了用户数变量,结果忘记赋值,整个报表显示都是NULL,客户直接炸锅了。
后来改用SET直接查询赋值,代码清晰多了。

数据类型选错是大坑
这点真的重要!选数据类型太随意,后面改起来头大。

存金额绝对别用FLOAT!用DECIMAL或者NUMERIC,比如DECIMAL(1 0,2 ),精确小数点后两位,银行系统都是这么用的。
我之前有个项目用FLOAT存钱,结果四舍五入差了几块钱,老板差点把我开除。
中文或者特殊字符用NVARCHAR,别用VARCHAR,否则可能会乱码。
我有个客户数据库在广东,存粤语名字就乱码,最后发现是没用NVARCHAR。
记录时间用TIMESTAMP,这个自带时区转换功能,特别方便。
我在做跨时区的报表系统时特别实用。
SQL Server的DATETIME也可以,但要注意它默认时区是服务器本地。
布尔值MySQL用BOOLEAN,但很多数据库支持TINYINT(1 ),用0和1 更直观。
比如判断用户是否VIP,我一般用TINYINT(1 )。

存储过程中的变量使用
存储过程用变量传参和存中间结果特别方便,但要注意作用域。

SQL Server例子:
sql CREATE PROCEDURE GetUserCountByCity @City VARCHAR(5 0) AS BEGIN DECLARE @UserCount INT; SELECT @UserCount = COUNT() FROM Users WHERE City = @City; SELECT @City AS City, @UserCount AS UserCount; END; -
执行 EXEC GetUserCountByCity 'New York';
MySQL例子:
sql CREATE PROCEDURE GetUserCountByCity(IN city VARCHAR(5 0)) BEGIN DECLARE user_count INT; SELECT COUNT() INTO user_count FROM Users WHERE City = city; SELECT city, user_count; END; -
执行 CALL GetUserCountByCity('New York');
作用域和命名是关键
这点我踩坑最多!全局变量和局部变量混用,结果一个存储过程把整个会话的变量都改了,导致其他查询也乱套。

命名要有前缀:比如参数用p_,局部变量用l_,全局变量用g_。
我之前在一个大项目里,两个存储过程用了同一个名字的局部变量,结果互相干扰,最后发现靠改命名才解决。
尽量用局部变量:全局变量容易被其他代码误改,特别是团队开发时。
我在做代码规范时强制要求,除了几个固定要全局的(比如错误码),其他都用局部。
MySQL的@符号变量:注意它默认是会话级别的,如果两个查询用同一个@变量,后一个会覆盖前一个。
我之前写一个报表脚本,本来想用@TotalCount存结果,结果两个查询用同一个@TotalCount,最后报表数据不对,真是蠢哭。

总结下我的建议
1 . SQL Server/Oracle:用DECLARE声明,变量名带@,类型明确写。
2 . MySQL:用SET直接赋值,简单高效。
3 . 数据类型:根据实际需求选,金额用DECIMAL,中文用NVARCHAR,时间用TIMESTAMP。
4 . 存储过程:变量传参很方便,但别用全局变量。
5 . 命名:一定要规范,前缀分清楚,别到时候改代码改到自己头上。

这些是我踩过的坑和总结的,你参考下吧。
还有其他问题可以继续问我哈。

sql定义表名为变量

哎哟,跟你说个事儿,这SQL里的表名当变量使,我当年可是踩过坑的。

比如,我1 4 年在上海那会儿,写一个ERP系统,客户临时要求能动态建表。
直接用 DECLARE @tableName NVARCHAR(5 0) 这种就得了,挺好使。

但后来,有个傻逼客户输入了个带单引号的表名,比如 'test\'; 你想啊,直接拼接 'CREATE TABLE ' + @tableName,就变成 'CREATE TABLE ' + 'test'''; 那可不就炸了,SQL直接崩了。

所以,你得加个过滤。
当年我那代码里,就加了个 REPLACE(@tableName, '''', ''),啥意思?把所有单引号都干掉。
虽然简单,但至少能防点破。
后来学聪明了,用正则替换,或者直接查系统表确认表名合法性,比如 IF EXISTS(SELECT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName) 这种。

哦对了,你说的 sp_executesql,我也用过。
1 6 年在北京,有个项目用这个,一开始总报错,后来发现是参数传错了,得用 @tableName = @tableName 这种形式传,不能直接传变量名。

最后提醒你一句,别老用动态SQL,特别是拼接字符串那种,容易中招。
当年有个同事,写了个拼接条件啥的,结果被人输入 ; DROP TABLE users 给整挂了,惨啊。

declareSQL中declare的经典语句

DECLARE @MyID uniqueidentifier, @INT int = 0; WHILE @INT < 1 xss=clean xss=clean>DECLARE @INT int = 1 , @ntt int = 1 ; WHILE @INT < 1 xss=clean xss=clean xss=clean xss=clean xss=clean>这就是方法。
用循环批量操作数据。