【发布时间】:2018-12-20 10:13:54
【问题描述】:
我有一个包含 40 个表的数据库。我想使用单个存储过程从某个表中选择数据。第一个表(TblSPAU1) 有6 列,命名为:ID, COL_SPAU1_EA, COL_SPAU1_EQ, COL_SPAU1_ore, COL_SPAU1_nivel, DateTime。例如,第四个表 (TblSPAU4) 有 6 列:ID, COL_SPAU4_EA, COL_SPAU4_EQ, COL_SPAU4_ore, COL_SPAU4_nivel, DateTime。所以我想要的是从表X中选择DateStart到DateStop的数据。到目前为止我所做的是:
USE [DBRapBreaza]
GO
/****** Object: StoredProcedure [dbo].[PS_SpauOPompa] Script Date: 12/19/2018 15:48:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[PS_SpauOPompa]
@DataStart datetime,
@DataStop datetime,
@val int
AS
BEGIN
SET NOCOUNT ON;
declare @sql NVARCHAR(max)
declare @col1 varchar
set @col1='ID'
declare @col2 varchar(25)
set @col2='COL_SPAU'+CONVERT(VARCHAR, @val)+'_EA'
declare @col3 varchar
set @col3='DateTime'
set @sql='select [ID]'+@col2+' FROM [DBRapBreaza].[dbo].[TblSPAU'+CONVERT(VARCHAR, @val)+ '] WHERE DateTime between'+CONVERT(VARCHAR(25), @DataStart,121)+ 'and'+CONVERT(VARCHAR(25), @DataStop,121)+';'
END
EXEC sp_sqlexec @sql, N'@DataStart datetime,@DataStop datetime,@val int', @DataStart, @DataStop, @val
我想从某个表中选择 ID 和第一列。 @val 代表我要从中选择数据的表的编号。
在sp_sqlexec 我有一个工具提示,它说我指定了太多参数。当我执行 EXEC 时,它会抛出这个错误:Msg 137, Level 15, State 2, Line 1. Must declare the scalar variable "@sql".
我的问题是我应该如何执行这个存储过程?
非常感谢!
【问题讨论】:
-
sp_sqlexec 不再受支持,因此您应该考虑使用 sp_executesql。阅读此sommarskog.se/dynamic_sql.html#sp_executesql
-
我删除了那个工具提示消息,但我仍然收到 Msg 137, Level 15, State 2, Line 1。必须声明标量变量“@sql”错误。我应该在代码的另一部分声明@sql 吗?
-
将 END 移到批处理的末尾
-
我把最后一个END移到EXEC之后,但还是出现错误。
标签: sql-server sql-server-2008 stored-procedures parameters dynamic-sql