DECLARE @date NVARCHAR(1000); set @date = '2023-06-05 00:00:00'; select * from iexp_reward_acticity where @date between activity_start and activity_end and is_deleted = 0 ; 上述sql语句为什么报错?报错信息:[Err] 42000 - [SQL Server]必须声明标量变量 "@date"。
时间: 2024-03-05 22:53:18 浏览: 33
这个 SQL 语句报错是因为 SQL Server 不支持在 WHERE 子句中使用变量作为列名或表名,只能将变量用于赋值或作为查询条件。
如果你想要在 WHERE 子句中使用变量,可以使用动态 SQL,将 SQL 语句拼接成一个字符串,然后使用 EXECUTE 或 sp_executesql 执行该字符串。例如:
```
DECLARE @date NVARCHAR(1000);
SET @date = '2023-06-05 00:00:00';
DECLARE @sql NVARCHAR(2000);
SET @sql = 'SELECT * FROM iexp_reward_acticity WHERE activity_start <= @date AND activity_end >= @date AND is_deleted = 0';
EXECUTE sp_executesql @sql, N'@date NVARCHAR(1000)', @date;
```
这里使用 sp_executesql 存储过程可以避免 SQL 注入攻击,同时也可以提高性能。
相关问题
DECLARE @start_date DATETIME DECLARE @end_date DATETIME DECLARE @DAM_ID DECLARE @SENSOR_ID DECLARE @WATER_TOP DECLARE @WATER_LEVEL SET @DAM_ID SET @SENSOR_ID SET @WATER_TOP SET @WATER_LEVEL SET @start_date = '2023-05-01 00:00:00' SET @end_date = GETDATE() WHILE @start_date <= @end_date BEGIN SET @DAM_ID = '27' SET @SENSOR_ID = '65' SET @WATER_TOP = SELECT '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)) SET @WATER_LEVEL = SELECT '129.7' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)) INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID,SENSOR_ID,WATER_TOP,HOLE_DEPTH,WATER_LEVEL,UPLOAD_TIME) VALUES (@DAM_ID,@SENSOR_ID,@WATER_TOP, @WATER_LEVEL,@start_date) SET @start_date = DATEADD(HOUR, 1, @start_date) END 这个存储过程报错你帮我解决一下
您好,根据您提供的存储过程代码,有以下几个问题:
1. 在设置变量值时,应该使用 SET @WATER_TOP = '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)),而不是 SET @WATER_TOP = SELECT '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255)),同理对于 @WATER_LEVEL 的设置也是如此。
2. 在 INSERT INTO 语句中,HOLE_DEPTH 这一列缺少值,需要设置其值。
3. 在 VALUES 后面的括号中,应该将 @start_date 放在最后一个参数的位置,即 INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID,SENSOR_ID,WATER_TOP,HOLE_DEPTH,WATER_LEVEL,UPLOAD_TIME) VALUES (@DAM_ID,@SENSOR_ID,@WATER_TOP, @WATER_LEVEL,@start_date)。
修改后的存储过程代码如下:
```
DECLARE @start_date DATETIME
DECLARE @end_date DATETIME
DECLARE @DAM_ID INT
DECLARE @SENSOR_ID INT
DECLARE @WATER_TOP VARCHAR(255)
DECLARE @WATER_LEVEL VARCHAR(255)
SET @DAM_ID = 27
SET @SENSOR_ID = 65
SET @start_date = '2023-05-01 00:00:00'
SET @end_date = GETDATE()
WHILE @start_date <= @end_date
BEGIN
SET @WATER_TOP = '231.9' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255))
SET @WATER_LEVEL = '129.7' + CAST(FLOOR(RAND()*999999) AS VARCHAR(255))
INSERT INTO [B_DAM_WATER_LEVEL] (DAM_ID, SENSOR_ID, WATER_TOP, HOLE_DEPTH, WATER_LEVEL, UPLOAD_TIME)
VALUES (@DAM_ID, @SENSOR_ID, @WATER_TOP, 0, @WATER_LEVEL, @start_date)
SET @start_date = DATEADD(HOUR, 1, @start_date)
END
```
希望能对您有所帮助!
declare @BC_Tzdno varchar(20) set @BC_Tzdno=ltrim(rtrim(cast('面碗' as varchar(20)))) select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no into #t from Tasts order by BC_Tzdno,process_no,Device_No,tast_date,prd_cname,pc_name if @BC_Tzdno='面碗' select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no from #t where tast_date >='2023-06-07 00:00:00.000' and tast_date<='2023-06-07 00:00:00.000' and process_no='01' and BC_Tzdno=@BC_Tzdno else if @BC_Tzdno like '%消餐%' select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no from #t where tast_date >='2023-06-07 00:00:00.000' and tast_date<='2023-06-07 00:00:00.000' and process_no='01' --and BC_Tzdno=@BC_Tzdno end drop table #t你好,以上代码是否有错误,帮我修改以下
你好,我看了一下你的代码,有以下几个需要修改的地方:
1. 在第一行代码中,将 '面碗' 改成 @BC_Tzdno,这样才能使用变量来动态指定条件。
2. 在第8行代码中,将 BC_Tzdno=@BC_Tzdno 的注释去掉,否则无法根据变量进行筛选。
3. 在第9行代码中,应该使用 ELSE IF 而不是 else if。
修改后的代码如下:
```
declare @BC_Tzdno varchar(20)
set @BC_Tzdno = ltrim(rtrim(cast(@BC_Tzdno as varchar(20))))
select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no into #t from Tasts
order by BC_Tzdno,process_no,Device_No,tast_date,prd_cname,pc_name
if @BC_Tzdno = '面碗'
select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no from #t
where tast_date >= '2023-06-07 00:00:00.000' and tast_date <= '2023-06-07 00:00:00.000'
and process_no = '01' and BC_Tzdno = @BC_Tzdno
else if @BC_Tzdno like '%消餐%'
select BC_Tzdno,prd_cname,Device_No,pc_name,BCSL,tast_date,process_no from #t
where tast_date >= '2023-06-07 00:00:00.000' and tast_date <= '2023-06-07 00:00:00.000'
and process_no = '01' and BC_Tzdno = @BC_Tzdno
drop table #t
```
这个修改后的代码应该可以正常运行了。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)