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 相关及其他)
各种 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存储过程如何将结果放入变量?的主要内容,如果未能解决你的问题,请参考以下文章

My SQL 动态查询执行并将输出输出到存储过程中的变量中

具有动态结果的存储过程到临时表中

将动态 SQL 的结果放入 sql-server 的变量中

在SQL存储过程中,如何声明变量,赋值变量。最好有具体语句配上实例。3Q啦。谢谢各位大侠的帮忙

Sql server 存储过程中怎么将变量赋值?

如何执行存储过程