`
冷寒冰
  • 浏览: 249062 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

动态sql详谈动态指定表名 列名(exec sql_executesql)

    博客分类:
  • sql
阅读更多

--在动态sql中,无论exec还是exec sp_executesql,都不允许使用参数形式的表名和列名,
--你可以使用变量或者在存储过程中使用存储过程参数声明部分的参数,而不是直接使用
--exec sp_executesql参数声明部分的参数

--典型的错误代码(there is no wrong with grammer,but not any row is returned)
declare @outPutValue as int,
@schemaname as nvarchar(50),
@tablename as nvarchar(50),
@filtercolumn as nvarchar(50),
@columnvalue as nvarchar(50),
@sql nvarchar(max);
set @schemaname='dbo';
set @tablename='orders';
set @filtercolumn='employeeid';
set @columnvalue='1';
set @sql='select count(*) from '+quotename(@schemaname)+'.'+quotename(@tablename)
+' where @fc=@cv ';--使用了参数形式的列名 the error occur
exec sp_executesql
@sql,
N'@fc as nvarchar(50),@cv as nvarchar(50),@outValue as int output',
@fc=@filtercolumn,
@cv=@columnvalue,
@outValue=@outPutValue output;
print @outPutValue;
print @sql;

--solution 1-----使用变量的方式为动态sql静态提供选择列,表名,过滤列
--此解决方案并展示了如何使用exec sp_executesql的输出参数
use northwind;
go
declare @outPutValue as int,
@schemaname as nvarchar(50),
@tablename as nvarchar(50),
@filtercolumn as nvarchar(50),
@columnvalue as nvarchar(50),
@countname as nvarchar(50),
@sql nvarchar(max);
set @schemaname='dbo';
set @tablename='orders';
set @filtercolumn='employeeid';
set @columnvalue='1';
set @countname='orderid';
set @sql='select @outValue=count('+@countname --使用了输出参数
+') from '
+quotename(@schemaname)+'.'+quotename(@tablename)
+' where '+@filtercolumn+'=@cv ';
exec sp_executesql
@sql,
N'@fc as nvarchar(50),@cv as nvarchar(50),@outValue as int output',
@fc=@filtercolumn,
@cv=@columnvalue,
@outValue=@outPutValue output;--使用输出参数为变量@outPutValue赋值,变量后加关键字output
print @outPutValue;
print @sql;
go

--solution 2-使用存储过程的参数为动态sql动态提供选择列,表名,过滤列
use NorthWind;
go
alter PROCEDURE GetData
@tbName nvarchar(50),
@colName nvarchar(50),
@Name nvarchar(50),
@filtername nvarchar(50)
AS
BEGIN
declare @sql nvarchar(max);
set @sql='select '+ @colName+' from ' +@tbName+ ' where '+@filtername+'=@whereName';
--注意此句不可以写成如下:
-- set @sql='select @colName from @tbName where employeeid=@whereName';
exec sp_executesql
@sql,
N'@whereName nvarchar(20)',
@Name
print @sql;
END

exec GetData
@name=N'1',
@tbName=N'dbo.Orders',
@colName=N'employeeid',
@filtername=N'employeeid';

 


conclusion:solution1 和solution 2 都成功避开了,不能直接使用参数形式的列名和表名的限制,
solution1使用的变量的方式是静态的,
solution2使用的是存储过程的参数的方式是动态的,这种方式可用性更强。

1
0
分享到:
评论

相关推荐

    SQL Server EXEC和sp_executesql的区别

    在SQL Server中,执行动态SQL或存储过程时,开发人员通常面临选择使用`EXEC`还是`sp_executesql`的问题。这两种方法虽然都能达到目的,但在功能、性能及安全性等方面存在显著差异。本文将详细介绍这两者的区别,并...

    PL/SQL实现获得所有表名及列名到表

    本文将详细探讨如何使用PL/SQL来实现获取数据库中所有表名及其列名,并存储到一个特定的表中。 ### 一、理解需求与设计思路 #### 1. 需求分析: 我们的目标是创建一个PL/SQL程序,该程序能够遍历当前用户拥有的...

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别.doc

    在SQL Server中,动态执行SQL语句有两个主要的命令:`EXEC`和`SP_EXECUTESQL`。两者都用于在运行时执行SQL语句,但它们之间存在显著的区别。 一、EXEC `EXEC`命令可以执行存储过程或者动态SQL语句。当我们需要执行...

    sql.rar_exec select_select_sql select from exec_普通sql大全

    Exec sp_executesql N select * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = FiledName Select @...

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

    这通常涉及将字符串拼接成完整的SQL命令,然后使用`EXEC`或`sp_executesql`存储过程来执行这个命令。下面是一个简单的例子: ```sql DECLARE @tableName NVARCHAR(100) = 'MyTable'; DECLARE @sqlCommand NVARCHAR...

    SQL_EXEC_命令用法

    SQL_EXEC 命令是一种重要的 SQL 语句,它可以执行存储过程或动态批次。动态批次是一个内容为 SQL 语句的字符串。例如,以下代码将执行一个 select 语句: declare @schemaName varchar(80),@tableName varchar(80),...

    SQL 行转列+动态获取列名

    SQL 行转列+动态获取列名 通用的动态获取列名

    动态SQL 并且把返回的值赋给变量

    本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意事项。 #### 动态SQL与`sp_executesql` 动态SQL是指在运行时构建的SQL语句,这种类型的SQL可以在不...

    dynamic_sql.rar_notes sql server

    假设我们需要根据用户输入的列名动态生成一个SELECT查询,可以这样编写: ```sql DECLARE @colName NVARCHAR(50) = 'ColumnName'; DECLARE @sql NVARCHAR(MAX) = N'SELECT ' + QUOTENAME(@colName) + ' FROM ...

    SQL语句_sql语言_SQL语句_sql_SQL开发_wiree7w_

    例如,`SELECT * FROM 表名`将返回表中的所有数据,而`SELECT 列名1, 列名2 FROM 表名`则只返回指定列的数据。 2. **数据过滤**:通过WHERE子句,我们可以对查询结果进行筛选。比如`SELECT * FROM 表名 WHERE 条件`...

    SQl查询数据库表名、表的列名

    根据给定的信息,本文将详细解释如何通过SQL查询获取数据库中的表名以及这些表的列名。这在数据库管理及开发工作中是常见的需求之一,掌握这些技能有助于更好地管理和操作数据库。 ### 一、获取数据库中的所有表名 ...

    SQLServer:探讨EXEC与sp_executesql的区别详解

    在SQL Server中,`EXEC` 和 `sp_executesql` 都是用来动态执行SQL语句的命令,但它们之间存在着显著的区别。这篇文章将详细解析这两个命令的用途、优缺点以及如何选择适合的使用场景。 首先,`EXEC` 命令主要用于...

    SQL Server查找表名或列名中包含空格的表和列实例代码

    本文主要给大家介绍的是关于SQL Server查找包含空格的表和列的相关内容,为什么会有这篇文章,是因为最近发现一个数据库中的某个表有个字段名后面包含了一个空格,这个空格引起了一些小问题,一般出现这种情况,是...

    SQL基本操作的简单知识点

    ALTER TABLE 表名 ADD CONSTRAINT FK__表名__列名 FOREIGN KEY (列名) REFERENCES 另一表名 (列名); ``` #### 4. 数据插入 插入数据到表中是常见的操作之一,可以通过`INSERT INTO`命令完成: - 插入单条记录: ```...

    动态SQL语句基本语法。动态SQL语句基本语法

    Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select ...

    从SQL脚本抽取数据库表名小工具.zip

    针对这一需求,有一个名为"从SQL脚本抽取数据库表名小工具.zip"的压缩包,它包含了一个Python小工具,专门用于从SQL脚本中高效地提取出所有引用的表名。 这个Python小工具的核心功能是利用正则表达式(Regular ...

    SQL Server中用T-SQL语句实现(建表、键约束、建关系)

    最后,关于约束的命名,建议遵循一定的规范,如主键约束 `PK_表名_列名`,检查约束 `CK_表名_列名`,默认约束 `DF_表名_列名`,唯一约束 `UQ_表名_列名` 和外键约束 `FK_表名_列名`。这样命名有助于日后的维护和理解...

    kettel循环执行动态sql

    标题中的“Kettle循环执行动态SQL”指的是使用Pentaho Data Integration(Kettle)工具来设计数据集成工作流,其中包含动态生成并执行SQL语句的步骤。在数据处理和ETL(Extract, Transform, Load)过程中,动态SQL是...

    Gbase8s动态sql的介绍

    与静态 SQL 不同,静态 SQL 需要预先知道每个 SQL 语句的确切内容,如表名、列名、where 子句检查了哪些列。 动态 SQL 的优点是可以很好的响应用户输入的内容,能够根据用户的输入动态改变 SQL 语句的内容。在 ...

Global site tag (gtag.js) - Google Analytics