SQL Sever 远程过程调用失败 的问题(解决)

本文解决因安装高版本Visual Studio导致的SQL Server版本冲突问题。主要表现为低版本SQL Server受到高版本VS附带的LocalDB影响。解决办法是在控制面板中卸载高于当前SQL Server版本的Microsoft SQL Server LocalDB。

问题主要出现在低版本的 SQL Sever 上,主要原因是安装了高版本的 VS;

其会附加如 2012,2016 的 Microsoft SQL Server 2012(2016) LocalDB

那么问题就简单了,打开控制面板,点击名称,方便查找。

找到 Microsoft SQL Server 2012 LocalDB 或者 Microsoft SQL Server 2016  LocalDB,就是版本比自己装的高的;

形如 Microsoft SQL Server **** LocalDB 的,卸载就好了。

图我就不发了,都被我卸了,没得发了。

### SQL Server 存储过程的使用与示例 #### 创建存储过程 存储过程可以通过 `CREATE PROC` 或 `CREATE PROCEDURE` 关键字定义。以下是创建带参数和无参数存储过程的示例: 1. **无参数存储过程** ```sql CREATE PROCEDURE GetAllComments AS BEGIN SELECT * FROM Comment; END; GO ``` 2. **带有输入参数的存储过程** 下面是一个查询特定评论的存储过程,它接收一个整型参数 `@commentid` 并返回对应的记录。 ```sql CREATE PROCEDURE GetComment @commentid INT AS BEGIN SELECT * FROM Comment WHERE CommentID = @commentid; END; GO ``` 3. **带有输入和输出参数的存储过程** 此存储过程计算某个新闻项下的评论总数,并将结果通过输出参数返回。 ```sql CREATE PROCEDURE GetCommentCount @newsid INT, @count INT OUTPUT AS BEGIN SELECT @count = COUNT(*) FROM Comment WHERE NewsID = @newsid; END; GO ``` 4. **返回单个值的函数** 函数类似于存储过程,但它主要用于返回单一值而非执行复杂的操作。 ```sql CREATE FUNCTION MyFunction (@newsid INT) RETURNS INT AS BEGIN DECLARE @count INT; SELECT @count = COUNT(*) FROM Comment WHERE NewsID = @newsid; RETURN @count; END; GO ``` 5. **返回表的函数** 这种类型的函数可以直接用于查询中,因为它会返回整个表格结构的数据。 ```sql CREATE FUNCTION GetFunctionTable (@newsid INT) RETURNS TABLE AS RETURN ( SELECT * FROM Comment WHERE NewsID = @newsid ); GO ``` #### 调用存储过程 调用存储过程的方式取决于其是否有输入/输出参数。 1. **调用无参数存储过程** ```sql EXEC GetAllComments; ``` 2. **调用带输入参数的存储过程** ```sql EXEC GetComment @commentid = 10; ``` 3. **调用带输入和输出参数的存储过程** 需要声明变量来保存输出的结果。 ```sql DECLARE @totalCount INT; EXEC GetCommentCount @newsid = 1, @count = @totalCount OUTPUT; PRINT @totalCount; ``` 4. **调用返回单个值的函数** 可以直接将其嵌入到其他查询语句中。 ```sql DECLARE @result INT; SET @result = dbo.MyFunction(1); PRINT @result; ``` 5. **调用返回表的函数** 将函数作为子查询的一部分使用。 ```sql SELECT * FROM dbo.GetFunctionTable(1); ``` #### Java 中调用 SQL Server 的存储过程 Java 使用 JDBC 提供了两种主要的方式来调用存储过程:`CallableStatement` 和 `PreparedStatement`。下面展示如何利用 `CallableStatement` 来实现这一目标。 1. **基本调用流程** 当前支持的方法包括 `execute()` 和 `executeUpdate()` 方法。前者适用于复杂场景,后者则适合于更新或删除等操作。 ```java String storedProcCall = "{call GetComment(?)}"; try (Connection conn = DriverManager.getConnection(url, username, password)) { CallableStatement stmt = conn.prepareCall(storedProcCall); stmt.setInt(1, commentId); boolean hasResults = stmt.execute(); // 执行存储过程 while (hasResults) { // 处理可能存在的多个结果集 ResultSet rs = stmt.getResultSet(); while (rs.next()) { System.out.println(rs.getString("Content")); } hasResults = stmt.getMoreResults(); } int updateCount = stmt.getUpdateCount(); // 获取受影响行数 } catch (SQLException e) { e.printStackTrace(); } ``` 2. **处理输出参数** 如果存储过程包含输出参数,则需要注册这些参数以便获取它们的值。 ```java String storedProcWithOutput = "{call GetCommentCount (?, ?)}"; try (Connection conn = DriverManager.getConnection(url, username, password)) { CallableStatement stmt = conn.prepareCall(storedProcWithOutput); stmt.setInt(1, newsId); stmt.registerOutParameter(2, Types.INTEGER); // 注册第二个参数为输出参数 stmt.executeUpdate(); int count = stmt.getInt(2); // 获取输出参数的值 System.out.println("Total Comments: " + count); } catch (SQLException e) { e.printStackTrace(); } ``` --- ### 总结 SQL Server 存储过程是一种预编译的对象,能够显著提升性能并简化网络通信开销[^1]。 它们既可以单独运行也可以被编程语言(如 Java)远程触发[^2]。 同时,在实际开发中应避免潜在的安全隐患比如 SQL 注入等问题[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值