在Sql Server查询语句中能不能用变量表示表名

liujingkun 2010-06-04 01:51:31
在Sql Server查询语句中能不能用变量表示表名

declare @d nvarchar(55)
set @d = 'A'
select * from @d

我这样做总不对
...全文
707 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiangyueming 2010-06-04
  • 打赏
  • 举报
回复
二楼的
--小F-- 2010-06-04
  • 打赏
  • 举报
回复
有时间看看动态语句基本语法:
1 :普通SQL语句可以用exec执行

Select * from tableName
exec('select * from tableName')
exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错

declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int, @sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)

--如何将exec执行结果放入变量中?

declare @num int, @sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num


1 :普通SQL语句可以用Exec执行 例: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

错误: declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
正确: Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错

--注:@s参数必须为ntext或nchar或nvarchar类型,必须将declare @s varchar(1000) 改为declare @s Nvarchar(1000)



如下:
declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)

set @fname = 'FiledName' --设置字段名
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输入或输出参数

(1)输入参数:
declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @input_id int--定义需传入动态语句的参数的值

set @QueryString='select * from tablename where id=@id' --id为字段名,@id为要传入的参数
set @paramstring='@id int' --设置动态语句中参数的定义的字符串
set @input_id =1 --设置需传入动态语句的参数的值为1
exec sp_executesql @querystring,@paramstring,@id=@input_id  
若有多个参数:
declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @input_id int--定义需传入动态语句的参数的值,参数1
declare @input_name varchar(20)--定义需传入动态语句的参数的值,参数2

set @QueryString='select * from tablename where id=@id and name=@name' --id与name为字段名,@id与@name为要传入的参数
set @paramstring='@id int,@name varchar(20)' --设置动态语句中参数的定义的字符串,多个参数用","隔开
set @input_id =1 --设置需传入动态语句的参数的值为1
set @input_name='张三' --设置需传入动态语句的参数的值为"张三"
exec sp_executesql @querystring,@paramstring,@id=@input_id,@name=@input_name --请注意参数的顺序
(2)输出参数
declare @num int, @sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?
declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
declare @output_result int--查询结果赋给@output_result

set @QueryString='select @totalcount=count(*) from tablename' --@totalcount 为输出结果参数
set @paramstring='@totalcount int output' --设置动态语句中参数的定义的字符串,多个参数用","隔开
exec sp_executesql @querystring,@paramstring,@totalcount=@output_result output
select @output_result
当然,输入与输出参数可以一起使用,大家可以自己去试一试。
另外,动态语句查询的结果集要输出的话,我只想到以下用临时表的方法,不知各位有没有更好的方法.
IF object_id('[tempdb].[dbo].#tmp') IS NOT NULL --判断临时表#tmp是否存在,存在则删除
drop table #tmp
select * into #tmp from tablename where 1=2 --创建临时表#tmp,其结构与tablename相同

declare @QueryString nvarchar(1000) --动态查询语名变量(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型)
set @QueryString='select * from tablename '
insert into #tmp(field1,field2,...) exec(@querystirng)
昵称被占用了 2010-06-04
  • 打赏
  • 举报
回复
declare @d nvarchar(55)
set @d = 'A'
exec('
select * from ' + @d + '
')

SSIS说明 SSIS初步认识 SSIS常见组件 SSIS变量使用 SSIS开发注意 SSIS包的部署 SQL创建作业 讲解内容 ETL-SSIS培训教程全文共34页,当前为第1页。 SSIS说明——什么是SSIS SSIS是Microsoft SQL Server Integration Services的简称,是生成高性能数据集成解决方案(包括数据仓库的提取、转换和加载 (ETL) 包)的平台(农银和兴业简称为ETL)。 ETL-SSIS培训教程全文共34页,当前为第2页。 SSIS说明——功能 SQL Server Integration Services (SSIS) 提供一系列支持业务应用程序开发的内置任务、容器、转换和数据适配器。您无需编写一行代码,就可以创建 SSIS 解决方案来使用 ETL 和商业智能解决复杂的业务问题,管理 SQL Server 数据库以及在 SQL Server 实例之间复制 SQL Server 对象 ETL-SSIS培训教程全文共34页,当前为第3页。 ETL说明——特色 1、可视化环境 熟悉了SSIS的可视化操作后,给你的感觉应该是震撼的,因为几乎你所能想得到的ETL操作都能通过简单托拽控件加以实现。 2、强大的参数设置功能 SSIS的另一个特色是的参数设置功能,这一点比DTS有了明显的进步。连接参数,源与目的关联的表名或者SQL语句的条件子句,都可以通过参数来构建,甚至参数本身可以由其他参数动态赋值(通过Expression功能),这就给用户提供了非常广阔界面编程的空间,充分发挥你的想象力,就能够在可视化界面上实现复杂逻辑功能的ETL操作。 ETL-SSIS培训教程全文共34页,当前为第4页。 1、创建SSIS项目文件 (1)在开始菜单中,找到SQL数据库文件下的SQL Server Business Intelligence Development Studio程序,单击运行程序。 (2)在打开的页面中,点击左上角的"文件 新建 项目",在商业智能项目目录下选择Integration Service项目,填入名称和位置,点击确定。 SSIS初步认识 ETL-SSIS培训教程全文共34页,当前为第5页。 SSIS初步认识 2、打开现有的SSIS项目文件 找到需要打开SSIS项目的文件夹,打开文件。找到文件后缀名为.sln的文件,并运行该文件 ETL-SSIS培训教程全文共34页,当前为第6页。 SSIS初步认识 3、页面介绍 菜单栏、工具箱、设计区、连接管理器、解决方案资源管理器等 菜单栏:所有的菜单选项 工具箱:所有的组件 设计区:开发组件区域 连接管理器:当前SSIS包所用到的数据源 解决方案资源管理器:可以查看数据源和项目文件 补充:整体风格和微软的C/S页面类似 ETL-SSIS培训教程全文共34页,当前为第7页。 SSIS初步认识 4、创建SSIS包 SSIS所有的开发都是在包中完成的。 创建包步骤:在右侧的解决方案资源管理器中,右键SSIS包文件夹,选择新建SSIS包,这样就可以开始ETL了 ETL-SSIS培训教程全文共34页,当前为第8页。 SSIS初步认识 5、创建数据源 做数据处理,当然不能少了数据,所以还需要添加数据源。这里的数据源包括数据来源和数据目标。在右侧的解决方案资源管理器中,右键数据源,选择新建数据源。 ETL-SSIS培训教程全文共34页,当前为第9页。 SSIS初步认识 6、数据源分类: 默认添加的是SQL Server数据源,提供程序选择"本机OLE DB\SQL Server Native Client10.0(SQL SERVER2008)"; Oracle数据源,我们可以选择"Oracle Provider for OLE DB"。 ETL-SSIS培训教程全文共34页,当前为第10页。 SSIS常用组件 1、执行SQL任务 执行一条或者多条SQL语句,SQL类型可以是增、删、改、查,也可以是执行一个存储过程。 补充:由于不同的数据源有不同的语法,并且SSIS对数据语言的支持度不一样,在数据库中能成功执行的SQL,在执行SQL任务不一定能正常执行。 例如:在执行SQL任务中,SQL SERVER语句支持注释(--),而在Oracle数据源下,不支持注释(--);还有调用其他数据源,需要主要用户是否有权限去操作表。 ETL-SSIS培训教程全文共34页,当前为第11页。 SSIS常用组件 2、数据流任务 数据流任务封装数据流引擎,该引擎在源和目标之间移动数据,使用户可以再移动数据时转换、清除和修改数据。将数据流任务添加到包控制流使得包可以提取、转换和加载数据。一个包中可以有多个数据流任务,也可以包含零个数据流任务。 ETL-SSIS培训教程全

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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