SQl 里面 我把 SQl查询语句写在一个临时变量里面,我该如何调用该变量来执行查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQl 里面 我把 SQl查询语句写在一个临时变量里面,我该如何调用该变量来执行查询相关的知识,希望对你有一定的参考价值。

create procedure [dbo].[Pro_CheckC]
@batcode nvarchar(50)
as
declare @SQL nvarchar(1000)
declare @TableName nvarchar(100)
declare @ProcessName nvarchar(50)
declare @LoginTime nvarchar(20)
declare @date nvarchar(6)

set @SQL=''
set @TableName=''
set @ProcessName=''
set @LoginTime=''
set @date=''

begin
set
@ProcessName=(select Processname from BatLogin where BatCode=
@batcode)
set
@LoginTime=(select LoginTime from BatLogin where BatCode=@batcode)
set
@date=(SUBSTRING(@LoginTime,0,4)+SUBSTRING(@LoginTime,4,2))
set
@TableName=('TableSel_'+@ProcessName+'_'+@date)
set
@SQL=('select * from '+@TableName+' where BatCode='+@batcode)
end

exec(@SQL)

(消息 102,级别 15,状态 1,第 1 行
'-' 附近有语法错误。)
怎么无法执行存储过程

exec Pro_CheckC @batcode='13031210959EB'

这样的执行语句还有错吗

set@SQL=('select * from '+@TableName+' where BatCode='+@batcode)
改为
set @SQL=('select * from '+@TableName+' where BatCode='''+@batcode+'''')

BatCode 应该是字符串类型。追问

是字符串啊,但是还是执行不了啊

追答

我测了没问题,可能要具体问题具体分析了
你把exec(@SQL) 改成 select @SQL
输出出来,看看你拼接的sql是怎样的。

参考技术A 你可以用exec来执行
如declare @sql varchar(100)
set @sql = 'select * from table1'
exec(@sql)
出现错误,你可以先将@SQL的内容显示出来看看,组成的SQL语句是否正确.
你上面的例子应为组@SQL时不对,@batcode为nvarchar类型,组时应加上引号.追问

我的那个是先把存储过程写好,然后再调用存储过程。。you know

参考技术B 直接在后面的SQL语句中的where条件中 字段= 变量 参考技术C exec(@变量) 参考技术D exec(@变量)

SQL Server临时表表标量和CTE

在SQL Server中临时表、表变量和CTE通常用来存储临时表数据,这里简单介绍下它们间的不同和不同的应用场景。

CTE

CTE通常叫做“通用表达式”,在内存中创建。
用途:通常用来替换需要递归的子查询。
有效范围:只能在包含他CTE的语句中可使用。
举例:有些复杂的查询语句中,子查询语句多次出现,这样代码显得冗长,且执行效率也不高:

Select D.* From D
Inner Join (
        Select id value, date From A
        Inner Join B on A.data < B.date
        Inner Join C on C.data > B.date
    ) CTE a c1 on c1.id = D.id+1
Inner Join (
    Select id value, date From A
    Inner Join B on A.data < B.date
    Inner Join C on C.data > B.date
) as c2 on c2.id = D.id-1

使用CTE替换子查询,将复杂的子查询结果保存,减少查询次数

with CTE as (
    Select id value, date From A
    Inner Join B on A.data < B.date
    Inner Join C on C.data > B.date
)
Select D.* From D
Inner Join CTE as c1 on c1.id = D.id+1
Inner Join CTE as c2 on c2.id = D.id-1

临时表

在sql server中,临时表是在运行时创建的,您可以执行在“普通表”上可以执行的所有操作。这些表是在temdb数据库中创建的。根据作用域和行为,临时表分为两种类型,如下所示

  1. 本地临时表
    本地临时表只对创建表的SQL服务器会话(连接)可用,在连接关闭时自动删除。声明时以‘#’为前缀。
    注意这里的会话,数据库指:同一个打开的查询窗口;调用它的asp.net程序:一次sqlconnection连接(并不是指asp.net中的会话)。
    新建本地临时表并插入数据
create Table #LocalTemp
(
    UserID int,
    Name varchar(50),
    Address varchar(150)
)

go
insert into #LocalTemp values(1,‘Shailendra‘,‘Noida‘)

在当前窗口中指向查询
select * from #LocalTemp;

  1. 全局临时表
    全局临时表可供所有SQL服务器会话或连接(即所有用户)使用。这些表可以由任何SQL服务器连接用户创建,当创建该临时表的连接关闭时会自动删除这些表。声明时以‘##’为前缀。
    新建全局临时表并插入数据
create Table ##GlobalTemp
(
    UserID int,
    Name varchar(50),
    Address varchar(150)
)

go
insert into ##GlobalTemp values(1,‘Shailendra‘,‘Noida‘)

另外打开一个新的窗口(或新换一用户连接)同样可正常查询
select * from ##GlobalTemp;

表变量

这就像一个变量,并存在于特定的一批查询执行中。一旦它从批中出来,它就会被删除。这也是在temdb数据库中创建的,而不是内存。这也允许您在表变量声明时创建主键、标识,而不是非聚集索引。
这里演示下它就像一个变量,可以当做参数传递到存储过程中
声明一个表变量类型

CREATE TYPE table_type_list AS TABLE 
(
    name varchar(50)
)
GO

创建接收表变量的存储过程

Create Proc test(
    @id int,
    @list table_type_list READONLY
)
as
begin
    set nocount on
    select * from @list
end

声明表变量,并向表变量中插入数据,执行存储过程

Declare @t table_type_list
Insert into @t(name) values(‘a‘), (‘b‘), (‘c‘)
Exec test 1, @t












以上是关于SQl 里面 我把 SQl查询语句写在一个临时变量里面,我该如何调用该变量来执行查询的主要内容,如果未能解决你的问题,请参考以下文章

为什么参数化查询可以防止SQL注入?(转)

Sql LinqLambda 查询语句的区别

sql linqlambda 查询语句的区别

SQL:with 查询

VFP里使用SQL的SELECT语句将查询结果存储在一个临时表中,应使用啥子句?

sql语句写在XML里面是一种框架吗?