【求助】把数据添加到临时表出错

gufengsheng 2005-05-06 04:19:49
代码如下:
declare @strSQL varchar(100)
CREATE TABLE #tempTable(ID int identity(1,1),NID int)
SET @strSQL = 'INSERT INTO #tempTable(NID) SELECT TOP 20 fID FROM [tOA] SELECT T1.*,T2.* FROM [tOA] AS T1, #tempTable AS T2 WHERE T1.fID = T2.NID AND T2.ID > 0 AND T2.ID <= 10 ORDER BY T2.ID DROP TABLE #tempTable'
EXEC (@strSQL)

如果是这样就不会出错:
CREATE TABLE #tempTable(ID int identity(1,1),NID int)
INSERT INTO #tempTable(NID) SELECT TOP 20 fID FROM [tOA] SELECT T1.*,T2.* FROM [tOA] AS T1, #tempTable AS T2 WHERE T1.fID = T2.NID AND T2.ID > 0 AND T2.ID <= 10 ORDER BY T2.ID DROP TABLE #tempTable
有谁知道为什么吗?
...全文
229 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
继续顶。。。。。。。。。。。。
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
不行的,我看你没改动啊
wudan8057 2005-05-06
  • 打赏
  • 举报
回复
--试一试
declare @s_sql varchar(4000)

set @s_sql = ''
set @s_sql = @s_sql + 'CREATE TABLE #tempTable(ID int identity(1,1),NID int)'
set @s_sql = @s_sql + 'INSERT INTO #tempTable(NID) SELECT TOP ' + str(@PageIndex*@PageSize) + ' fID FROM [' + @tblName + ']'

IF (@strWhere != '')
SET @s_sql = @s_sql + ' WHERE ' + @strWhere + @strOrder
ELSE
SET @s_sql = @s_sql + @strOrder

--以下代码赋予了@strSQL以真正执行的SQL代码
SET @s_sql = @s_sql + ' SELECT ' + @strGetFields + ', T2.ID FROM [' + @tblName + '] T1, #tempTable T2 WHERE T1.fID = T2.NID AND T2.ID > ' + @PageLowerBound + ' AND T2.ID <= ' + @PageUpperBound + ' ORDER BY T2.ID DROP TABLE #tempTable'
EXEC (@strSQL)
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
楼上的,不能用SELECT INTO的,因为我的fID字段是自动编号字段。
wudan8057 2005-05-06
  • 打赏
  • 举报
回复
或者:
SELECT TOP 20
identity(int,1,1) id,
fID
INTO #tempTable
FROM [tOA]

SELECT T1.*,T2.*
FROM [tOA] AS T1, #tempTable AS T2
WHERE T1.fID = T2.NID AND
T2.ID > 0 AND
T2.ID <= 10
ORDER BY T2.ID

DROP TABLE #tempTable
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
楼上的,还是有错啊,说什么SE附近有错误。
我的全部SQL如下(人家的代码修改的,是把数据绑定到DataGrid的):
CREATE PROCEDURE spNavigators
(
@tblName varchar(15),
@strGetFields varchar(100) = '*',
@PageSize int = 20,
@PageIndex int = 1,
@doCount bit = 0,
@strOrderBy varchar(50) = '',
@strWhere varchar(100) = '',
@RecordCount int output
)
AS
-- 主语句
DECLARE @strSQL varchar(400)
SET @strSQL = ''
-- 排序变量
DECLARE @strOrder varchar(70)
SET @strOrder = ''

SET @RecordCount = 0
--如果@doCount传递过来的不是0,就执行总数统计
IF (@doCount != 0)
BEGIN
DECLARE @sWhere varchar(120)

SET @sWhere = ''
IF (@strWhere != '')
SET @sWhere = ' WHERE ' + @strWhere

SET @strSQL = 'if exists (select * from dbo.sysobjects where id = object_id(''[dbo].[tmpTable]'') and OBJECTPROPERTY(id, ''IsUserTable'') = 1) '
SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [' + @tblName + '] ' + @sWhere + ') '
SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [' + @tblName + '] ' + @sWhere

EXEC (@strSQL)

SELECT @RecordCount=Total FROM tmpTable

--删除总数统计临时表
EXEC ('DROP TABLE tmpTable')
END

PRINT @RecordCount

--排序字段信息
IF (@strOrderBy != '')
SET @strOrder = ' ORDER BY ' + @strOrderBy

--如果是第一页就执行以上代码,这样会加快执行速度
IF (@PageIndex = 1)
BEGIN
IF (@strWhere != '')
SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM [' + @tblName + '] WHERE ' + @strWhere + @strOrder
ELSE
SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFields + ' FROM ['+ @tblName + '] '+ @strOrder
END
ELSE
BEGIN
--为搜索表建立自动编号 保存到临时表中
DECLARE @PageLowerBound int /* 数组下标 */
DECLARE @PageUpperBound int /* 数组上标 */
SET @PageLowerBound=(@PageIndex-1)*@PageSize
SET @PageUpperBound=@PageLowerBound+@PageSize
CREATE TABLE #tempTable(ID int identity(1,1),NID int)

SET @strSQL = 'INSERT INTO #tempTable(NID) SELECT TOP ' + str(@PageIndex*@PageSize) + ' fID FROM [' + @tblName + ']'
IF (@strWhere != '')
SET @strSQL = @strSQL + ' WHERE ' + @strWhere + @strOrder
ELSE
SET @strSQL = @strSQL + @strOrder

--以下代码赋予了@strSQL以真正执行的SQL代码
SET @strSQL = @strSQL + ' SELECT ' + @strGetFields + ', T2.ID FROM [' + @tblName + '] T1, #tempTable T2 WHERE T1.fID = T2.NID AND T2.ID > ' + @PageLowerBound + ' AND T2.ID <= ' + @PageUpperBound + ' ORDER BY T2.ID DROP TABLE #tempTable'
END

PRINT @strSQL

EXEC (@strSQL)


GO


wudan8057 2005-05-06
  • 打赏
  • 举报
回复
改为:
declare @strSQL varchar(100)
CREATE TABLE #tempTable(ID int identity(1,1),NID int)
SET @strSQL = 'CREATE TABLE #tempTable(ID int identity(1,1),NID int)
INSERT INTO #tempTable(NID) SELECT TOP 20 fID FROM [tOA]
SELECT T1.*,T2.*
FROM [tOA] AS T1, #tempTable AS T2
WHERE T1.fID = T2.NID AND
T2.ID > 0 AND
T2.ID <= 10 ORDER BY T2.ID
DROP TABLE #tempTable'
EXEC (@strSQL)
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
为什么不用Select Into,是因为我的原始表中存在自动编号字段。
gufengsheng 2005-05-06
  • 打赏
  • 举报
回复
还有就是我为什么要用参数是因为我的@strSQL是动态的。

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧