`
冷寒冰
  • 浏览: 254205 次
  • 性别: 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`的问题。这两种方法虽然都能达到目的,但在功能、性能及安全性等方面存在显著差异。本文将详细介绍这两者的区别,并...

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

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

    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_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可以在不...

    解析SQL提取表名并输出文本文件

    tables = re.findall(pattern, sql_text) return tables ``` 这段代码将遍历SQL文本,寻找符合`CREATE TABLE`模式的行,并提取出表名。如果需要处理更复杂的SQL语句,可能还需要考虑到嵌套的SQL、子查询以及表...

    动态SQL语句基本语法

    动态SQL语句是指使用字符串来构建SQL语句,然后使用EXEC或sp_executesql语句来执行的SQL语句。下面是动态SQL语句的一些基本语法和应用场景: 一、普通SQL语句可以用Exec执行 可以使用Exec语句来执行普通的SQL语句...

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

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

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

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

    Gbase8s动态sql的介绍

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

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

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

    学习SQL 应知道的动态SQL 语句基本语法

    通过以上示例可以看到,动态SQL语句不仅可以用来根据变量生成不同的查询语句,还可以通过`sp_executesql`函数安全地执行动态SQL,并且能够处理输出参数。此外,对于SQL Server中的identity列,了解其特性及如何正确...

    《kettle中实现动态SQL查询》博客文章示例代码

    本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...

    动态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 ...

    kettel循环执行动态sql

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

    读取数据库名,表名,列名的小程序

    在IT领域,数据库管理是...总之,这个"读取数据库名,表名,列名的小程序"是C#与SQL Server交互的一个实例,它展示了如何利用ADO.NET框架高效地获取数据库结构信息,对于数据库管理和开发人员来说,是一个实用的工具。

    PLSQL开发过程中,动态使用DBMS_SQL[借鉴].pdf

    dbms_sql.parse(cur, sql_stmt, dbms_sql.native); dbms_sql.execute(cur); dbms_sql.close_cursor(cur); end; 在这个示例中,我们使用 DBMS_SQL 包来执行一个 SELECT 语句,获取 dinya_test 表中的所有记录。 ...

    特别SQL语句-列名查询

    在SQL(结构化查询语言)中,查询列名是一项基础但重要的操作,尤其在处理复杂的数据库结构时。列名查询可以帮助我们了解表的结构,更好地编写SQL查询或进行数据分析。以下将详细介绍如何在SQL中查询列名,并提供...

Global site tag (gtag.js) - Google Analytics