sql sql_executesql 和 sqlparameter 怎么结合

yeliangnihao 2017-10-19 02:16:14
这2天根据项目需求,需要使用动态sql语句 动态参数,但是2天都没搞清 sql_executesql 和 sqlparameter 怎么结合

比如
sql='select count(id) from aaaaa where id=@id'

然后使用exec sql_executesql 执行

c#里面通过sqlparameter传参数,但是为什么都会报错,显示@id未声明,痛苦啊哪位大神解决下
...全文
432 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-10-19
  • 打赏
  • 举报
回复
ALTER PROC dbo.protest
@Parameters NVARCHAR(MAX) , --参数都写在这里
@type INT
AS
BEGIN
DECLARE @sql NVARCHAR(100)
IF @type = 1
BEGIN
DECLARE @id INT
SET @id = CONVERT(INT, @Parameters) --type是1直接写死
SET @sql = 'select @id as id' --这里的sql语句是从数据库中读取出来的
EXEC sp_executesql @sql, N'@id int ', @id
END
IF @type = 2
BEGIN
DECLARE @id2 INT ,
@name NVARCHAR(100)
SET @id2 = (SELECT value FROM dbo.F_Split(@Parameters,',') WHERE id=1)
SET @name = (SELECT value FROM dbo.F_Split(@Parameters,',') WHERE id=2)
SET @sql = 'select @id2 as id,@name as name'
EXEC sp_executesql @sql, N'@id2 int,@name NVARCHAR(100) ',
@id2, @name
END
END
GO

EXEC dbo.protest @Parameters = N'11',
@type = 1

EXEC dbo.protest @Parameters = N'1,测试姓名',
@type = 2


yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 16 楼 sinat_28984567 的回复:
[quote=引用 15 楼 yeliangnihao 的回复:] [quote=引用 14 楼 sinat_28984567 的回复:] [quote=引用 13 楼 yeliangnihao 的回复:] [quote=引用 12 楼 sinat_28984567 的回复:] 存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
忘记说了,参数也是动态的,所以不好弄啊[/quote] 只要有数据库都好弄[/quote] 因为每条sql语句不一样,参数一不一样,所以我还会在读取sql语句的同时读取参数,但是存储过程得参数不能动态创建,所以目前很无赖啊[/quote] 存储过程可以就建一个参数,然后参数到里边在进行拆分处理。[/quote] 没懂啊,能不能给个例子
二月十六 2017-10-19
  • 打赏
  • 举报
回复
引用 15 楼 yeliangnihao 的回复:
[quote=引用 14 楼 sinat_28984567 的回复:] [quote=引用 13 楼 yeliangnihao 的回复:] [quote=引用 12 楼 sinat_28984567 的回复:] 存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
忘记说了,参数也是动态的,所以不好弄啊[/quote] 只要有数据库都好弄[/quote] 因为每条sql语句不一样,参数一不一样,所以我还会在读取sql语句的同时读取参数,但是存储过程得参数不能动态创建,所以目前很无赖啊[/quote] 存储过程可以就建一个参数,然后参数到里边在进行拆分处理。
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 14 楼 sinat_28984567 的回复:
[quote=引用 13 楼 yeliangnihao 的回复:] [quote=引用 12 楼 sinat_28984567 的回复:] 存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
忘记说了,参数也是动态的,所以不好弄啊[/quote] 只要有数据库都好弄[/quote] 因为每条sql语句不一样,参数一不一样,所以我还会在读取sql语句的同时读取参数,但是存储过程得参数不能动态创建,所以目前很无赖啊
二月十六 2017-10-19
  • 打赏
  • 举报
回复
引用 13 楼 yeliangnihao 的回复:
[quote=引用 12 楼 sinat_28984567 的回复:] 存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
忘记说了,参数也是动态的,所以不好弄啊[/quote] 只要有数据库都好弄
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 12 楼 sinat_28984567 的回复:
存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
忘记说了,参数也是动态的,所以不好弄啊
二月十六 2017-10-19
  • 打赏
  • 举报
回复
存储过程这样写:
CREATE PROC dbo.protest @id INT  
AS
    BEGIN   
        DECLARE @sql NVARCHAR(100)
        SET @sql = 'select @id as id'      --这里的sql语句是从数据库中读取出来的
        EXEC sp_executesql @sql, N'@id int  ', @id
    END
GO



参数这样传入:
SqlCommand command = new SqlCommand();
            command.Connection = sqlCnt;
            command.CommandType = System.Data.CommandType.StoredProcedure;
            command.CommandText = "protest";
            command.Parameters.Add("@ID", SqlDbType.Int);
            command.Parameters["@ID"].Value = 1;
            SqlDataReader reader = command.ExecuteReader();    
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 9 楼 yeliangnihao 的回复:] [quote=引用 8 楼 sinat_28984567 的回复:] [quote=引用 7 楼 yeliangnihao 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] 如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
我不能直接写,因为执行的sql语句条件也是先查询出来的,为了不二次查询,所以用存储过程执行[/quote] 存储过程就用4#那个代码[/quote] 就是试过了,不行,参数传不了[/quote] 存储过程怎么写的,发上来[/quote] 你好,由于存储过程没写完,我给具体说下流程: 我有一张配置表,里面是储存我要执行的sql代码,所以每次我需要先去配置表里面先去把我要的sql语句查出来(sql语句有可能带参数,比如select count(id) from aaaa where id=@id),我会在存储过程里面set 一个标量赋值给我查询出来的那句sql语句 最后用exec sql_executesql 执行赋值的变量,但是变量里面有个@id参数,这个参数因为考虑到防注入所以我需要在c#里面用sqlparameter来执行,你可以试下 不知道我表达的意思你理解不
二月十六 2017-10-19
  • 打赏
  • 举报
回复
引用 9 楼 yeliangnihao 的回复:
[quote=引用 8 楼 sinat_28984567 的回复:] [quote=引用 7 楼 yeliangnihao 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] 如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
我不能直接写,因为执行的sql语句条件也是先查询出来的,为了不二次查询,所以用存储过程执行[/quote] 存储过程就用4#那个代码[/quote] 就是试过了,不行,参数传不了[/quote] 存储过程怎么写的,发上来
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 8 楼 sinat_28984567 的回复:
[quote=引用 7 楼 yeliangnihao 的回复:] [quote=引用 5 楼 sinat_28984567 的回复:] 如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
我不能直接写,因为执行的sql语句条件也是先查询出来的,为了不二次查询,所以用存储过程执行[/quote] 存储过程就用4#那个代码[/quote] 就是试过了,不行,参数传不了
二月十六 2017-10-19
  • 打赏
  • 举报
回复
引用 7 楼 yeliangnihao 的回复:
[quote=引用 5 楼 sinat_28984567 的回复:] 如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
我不能直接写,因为执行的sql语句条件也是先查询出来的,为了不二次查询,所以用存储过程执行[/quote] 存储过程就用4#那个代码
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 5 楼 sinat_28984567 的回复:
如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
我不能直接写,因为执行的sql语句条件也是先查询出来的,为了不二次查询,所以用存储过程执行
二月十六 2017-10-19
  • 打赏
  • 举报
回复
如果是在程序中动态拼接不用EXEC sp_executesql就行了
cmd.CommandType = CommandType.Text;
cmd.CommandText = "select count(id) from aaaaa where id=@id";   
cmd.Parameters.Add("@id", SqlDbType.Int);
cmd.Parameters["@id"].Value = 1;  
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
还是CommandText写的是exec sql_executesql ?
c#代码里面我用的sql执行的,因为测试
二月十六 2017-10-19
  • 打赏
  • 举报
回复
数据库中这样用
DECLARE @sql NVARCHAR(100)
SET @sql = 'select @id'
EXEC sp_executesql @sql, N'@id int  ', 1
二月十六 2017-10-19
  • 打赏
  • 举报
回复
还是CommandText写的是exec sql_executesql ?
yeliangnihao 2017-10-19
  • 打赏
  • 举报
回复
就是用的exec sql_executesql 后面是一句sql语句,但是sql语句里面有动态参数,例如 @id ,但是我们在后台使用sqlparameter创建@id并赋值没用啊,要报错,提示@id未声明变量
二月十六 2017-10-19
  • 打赏
  • 举报
回复
使用exec sql_executesql 执行,是存储过程吗?
通过慢sql分析的学习,了解什么是慢sql,以及慢SQL会引起那些性能问题。清楚慢sql日志的设置,然后再通过慢sql分析工具的学习,清楚慢sql分析的步骤和流程。慢sql分析工具:mysqldumpslow工具、explain工具、profile工具、Optimizer Trace工具。 提供课程中所使用的sql语句。 课程内容:第一章:课程简介1、课程介绍2、课程大纲 第二章:慢sql简介1、慢sql简介2、慢sql会引起的问题 第三章:慢日志的设置1、慢sql的分析流程2、慢日志参数理解3、慢日志参数设置:第1种方式:my.ini文件设置4、慢日志参数设置:第2种方式:sql脚本设置5、慢日志参数设置-效果验证 第四章:如何发现慢sql1、如何发现慢sql:第1种方式:慢日志文件2、如何发现慢sql:第2种方式:mysql库的slow_log表 第五章:慢sql分析工具1、慢sql提取-mysqldumpslow工具-使用方法2、慢sql提取-mysqldumpslow工具-操作实战3、慢sql的执行计划分析-explain分析-执行计划结果说明4、慢sql的执行计划分析-explain分析-索引介绍+type类型举例5、慢sql的资源开销分析-profile分析-分析步骤6、慢sql的资源开销分析-profile分析-show profile执行阶段说明7、慢sql的资源开销分析-profile分析-完整列表说明+操作实战8、慢sql的跟踪分析-Optimizer Trace分析-分析步骤9、慢sql的跟踪分析-Optimizer Trace表的介绍10、索引失效场景举例 第六章:慢日志清理1、慢日志清理

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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