SQL存储过程如何将结果放入变量?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL存储过程如何将结果放入变量?相关的知识,希望对你有一定的参考价值。
CREATE PROCEDURE iuser.signin_verify
@user_name nvarchar(32),
@user_pwd nvarchar(32),
@signin_result bit output,
@user_type nvarchar(10) output,
@user_last_login smalldatetime output,
@user_email nvarchar(60) output,
@user_location nvarchar(20) output,
@user_homepage nvarchar(100) output,
@user_qq nvarchar(13) output,
@user_msn nvarchar(50) output,
@user_skype nvarchar(20) output,
@user_gender smallint output,
@user_blogger bit output,
@user_disabled bit output
AS
select user_name,user_last_login,user_email,user_location,user_homepage,user_qq,user_msn,user_skype,user_gender,user_blogger,user_disabled from user_db where (user_name = @user_name and user_pwd = @user_pwd)
GO
我想将各个查询结果放入变量,比如user_name列的值放入@user_name,但是我在后面加上
set @user_name = user_name
提示列user_name无效,请问这个存储过程如何写?
1楼的,这个似乎对我的问题没有什么帮助耶
2楼的,你那种方法确实可以,但是我想知道,现在我这条查询语句返回多个列,如何将他们全部装入变量那?
各种 SET 选项——多数与 showplan 相关——以多种复杂的方式影响着查询计划和执行上下文的编译、缓存和重用。下表汇总了相关的详细信息。
应按如下顺序阅读该表中的内容。批处理通过表中第一列所指定的特定模式提交给 SQL Server。已提交的批处理的计划缓存中可能存在、也可能不存在已缓存的查询计划。第 2 列和第 3 列描述了存在已缓存的查询计划时的情况;第 4 列和第 5 列说明了不存在已缓存的查询计划时的情况。在每个类别中,查询计划和执行上下文的各种情况都是独立的。表中说明了结构(查询计划或执行上下文)所发生的情况:是否被缓存、重用和使用。
模式名称 存在已缓存的查询计划时 存在已缓存的查询计划时 不存在已缓存的查询计划时 不存在已缓存的查询计划时
查询计划
执行上下文
查询计划
执行上下文
showplan_text, showplan_all, showplan_xml
被重用(无编译)
被重用
被缓存(编译)
生成一个执行上下文,对其进行缓存但不使用它
statistics profile, statistics xml, statistics io, statistics time
被重用(无编译)
不被重用生成并使用一个全新的执行上下文,但不对其进行缓存
被缓存(编译)
生成并使用一个全新的执行上下文,但不对其进行缓存
noexec
被重用(无编译)
被重用
被缓存(编译)
不生成执行上下文(由于“noexec”模式)。
parseonly(例如,在查询分析器或 Management Studio 中按“分析”按钮)
无
无
无
无
查询计划和执行上下文的相关成本
参考资料:http://www.pcvk.com/Database0/SQL000/SQL006/14812.html
参考技术A 怎么都这么长啊。两种做法:
set @user_name = (select user_name from ...)
select @user_name = username .... from ... where...
自己发挥一下就行了
1.
set @user_name = (select user_name from ...)
set @user_pwd = (select user_pwd from ...)
.
.
.
2.
select @user_name = username, @user_pwd = user_pwd, ...from ... where... 参考技术B 返回多个列怎么装入变量,存入记录集吧。
如何将变量值与 select 语句的结果一起放入 sql 表中?
【中文标题】如何将变量值与 select 语句的结果一起放入 sql 表中?【英文标题】:How can I a variable value into a sql table along with the results from a select statement? 【发布时间】:2019-07-01 18:31:55 【问题描述】:我正在尝试将 SQL 选择语句的结果与 FETCH 循环内的 SQL 变量中的值一起插入表中。我可以只对选择结果进行插入,但不知道如何插入变量值。
这是我尝试过的:
IF CURSOR_STATUS('global','CURSOR_ALLDB_NAMES')>=-1
BEGIN
DEALLOCATE CURSOR_ALLDB_NAMES
END
IF OBJECT_ID('tempdb..#TempIDs') IS NOT NULL DROP TABLE #TempIDs
CREATE TABLE #TempIDs(
ID char(256)
,DBName char(256))
DECLARE @DB_NAME nvarchar(256);
DECLARE CURSOR_ALLDB_NAMES CURSOR FOR
SELECT name
FROM Sys.Databases
WHERE name like 'ZM_%'
OPEN CURSOR_ALLDB_NAMES
FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME
WHILE @@Fetch_Status = 0
BEGIN
-- if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID) Select ID from '+ @DB_NAME + '.dbo.Userlist')
if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID, DBName) Select ID, @DB_NAME from '+ @DB_NAME + '.dbo.Userlist')
FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME
END
Select * from #TempIDs
我得到了这个结果:
Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "@DB_NAME".
我也试过这个,但没有用:
if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID, set DBName=''' +@DB_NAME + ''') Select ID from '+ @DB_NAME + '.dbo.Userlist')
FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME
这也不起作用:
if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID, DBName=''' +@DB_NAME + ''') Select ID from '+ @DB_NAME + '.dbo.Userlist')
FETCH CURSOR_ALLDB_NAMES INTO @DB_NAME
【问题讨论】:
你试过双引号吗?Select ID from '''+ @DB_NAME + '''.dbo.Userlist'
@Jeremy,我尝试了你的建议,但这不是我遇到问题的地方,它也给出了一个错误,因为这不是我试图使用 (at)DB_NAME 值的地方,所以我尝试了这个:'插入#TempIDs(ID,DBName)从'+(at)DB_NAME +'.dbo.Userlist'中选择ID,''(at)DB_NAME''。这并没有给出错误,但是它将文字 (at)DB_NAME 放在列中,而不是 (at)DB_NAME 的值。 ...顺便说一句,使用 (at) 来表示 at 符号,因为 *** 一直在抱怨。
考虑到原来的错误在这里from '+ @DB_NAME + '.dbo.Userlist
,你确实把路径写满了; 'DB'.'方案'.'表'。当您从游标中的动态 SQL 开始时,您不在同一个执行上下文中。进行调试的一种简单方法是将动态查询分配给 var 并使用 EXEC(@query)
和 PRINT(@query)
进行切换,如果您可以执行输出打印,那么它将在 EXEC()
中工作
您的两个INSERT
语句都不正确。相反:'Insert into #TempIDs (ID, DBName) Select ID, ''' + @DB_NAME + ''' from ' + @DB_NAME + '.dbo.Userlist'
试一试,我想你会得到它。
【参考方案1】:
感谢 cmets 中的@JNevil:
更改 SQL 语句。此行已更改,现在可以使用:
if OBJECT_ID(@DB_NAME + '.dbo.Userlist') is not null EXEC('Insert into #TempIDs (ID, DBName) Select ID, ''' + @DB_NAME + ''' from ' + @DB_NAME + '.dbo.Userlist')
【讨论】:
以上是关于SQL存储过程如何将结果放入变量?的主要内容,如果未能解决你的问题,请参考以下文章