--在动态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使用的是存储过程的参数的方式是动态的,这种方式可用性更强。
分享到:
相关推荐
在SQL Server中,执行动态SQL或存储过程时,开发人员通常面临选择使用`EXEC`还是`sp_executesql`的问题。这两种方法虽然都能达到目的,但在功能、性能及安全性等方面存在显著差异。本文将详细介绍这两者的区别,并...
标题中的"EXEC_SQL.rar_EXEC S_Exec开发人员_delphi ex_exec sql_exec_sql.e"暗示了这是一个与编程相关的压缩包,特别关注的是执行SQL语句的功能。"EXEC_S"可能指的是在Delphi环境下开发的一个组件或函数,用于执行...
本文将详细探讨如何使用PL/SQL来实现获取数据库中所有表名及其列名,并存储到一个特定的表中。 ### 一、理解需求与设计思路 #### 1. 需求分析: 我们的目标是创建一个PL/SQL程序,该程序能够遍历当前用户拥有的...
这通常涉及将字符串拼接成完整的SQL命令,然后使用`EXEC`或`sp_executesql`存储过程来执行这个命令。下面是一个简单的例子: ```sql DECLARE @tableName NVARCHAR(100) = 'MyTable'; DECLARE @sqlCommand NVARCHAR...
Exec sp_executesql N select * from tableName -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL eg: declare @fname varchar(20) set @fname = FiledName Select @...
SQL_EXEC 命令是一种重要的 SQL 语句,它可以执行存储过程或动态批次。动态批次是一个内容为 SQL 语句的字符串。例如,以下代码将执行一个 select 语句: declare @schemaName varchar(80),@tableName varchar(80),...
SQL 行转列+动态获取列名 通用的动态获取列名
本文将详细介绍如何利用`sp_executesql`来执行动态SQL,并重点讨论如何将执行结果赋值给变量,以及一些重要的注意事项。 #### 动态SQL与`sp_executesql` 动态SQL是指在运行时构建的SQL语句,这种类型的SQL可以在不...
使用 sp_executesql 语句可以执行动态生成的 SQL 语句,例如: declare @s nvarchar(1000) set @s = 'select * from tableName' exec sp_executesql @s 动态 SQL 语句中的变量 在动态 SQL 语句中,可以使用变量来...
例如,`SELECT * FROM 表名`将返回表中的所有数据,而`SELECT 列名1, 列名2 FROM 表名`则只返回指定列的数据。 2. **数据过滤**:通过WHERE子句,我们可以对查询结果进行筛选。比如`SELECT * FROM 表名 WHERE 条件`...
动态SQL语句是指使用字符串来构建SQL语句,然后使用EXEC或sp_executesql语句来执行的SQL语句。下面是动态SQL语句的一些基本语法和应用场景: 一、普通SQL语句可以用Exec执行 可以使用Exec语句来执行普通的SQL语句...
根据给定的信息,本文将详细解释如何通过SQL查询获取数据库中的表名以及这些表的列名。这在数据库管理及开发工作中是常见的需求之一,掌握这些技能有助于更好地管理和操作数据库。 ### 一、获取数据库中的所有表名 ...
本文主要给大家介绍的是关于SQL Server查找包含空格的表和列的相关内容,为什么会有这篇文章,是因为最近发现一个数据库中的某个表有个字段名后面包含了一个空格,这个空格引起了一些小问题,一般出现这种情况,是...
在SQL Server中,`EXEC` 和 `sp_executesql` 都是用来动态执行SQL语句的命令,但它们之间存在着显著的区别。这篇文章将详细解析这两个命令的用途、优缺点以及如何选择适合的使用场景。 首先,`EXEC` 命令主要用于...
与静态 SQL 不同,静态 SQL 需要预先知道每个 SQL 语句的确切内容,如表名、列名、where 子句检查了哪些列。 动态 SQL 的优点是可以很好的响应用户输入的内容,能够根据用户的输入动态改变 SQL 语句的内容。在 ...
ALTER TABLE 表名 ADD CONSTRAINT FK__表名__列名 FOREIGN KEY (列名) REFERENCES 另一表名 (列名); ``` #### 4. 数据插入 插入数据到表中是常见的操作之一,可以通过`INSERT INTO`命令完成: - 插入单条记录: ```...
本文将深入探讨如何在Kettle中实现动态SQL查询,这对于处理复杂的数据库操作和数据迁移至关重要。我们将讨论问号占位符和命名参数这两种方法,并分析它们的区别。 首先,让我们理解什么是动态SQL查询。在传统的SQL...
4. **自动提示**:SQL Plus具有命令和对象名的自动完成功能,有助于快速输入长命令或表名、列名等。 5. **错误处理**:在执行脚本时,如果遇到错误,SQL Plus会停止执行,并显示错误信息,方便定位问题。 6. **...
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select ...