sql-server - 将数据库名称作为参数传递给 sp_executesql 以在查询中替换
问题描述
我正在尝试执行连接来自不同数据库的表的 SQL 语句。我想知道是否可以以任何方式替换通过 sp_executesql 作为参数传递的数据库名称?
exec sp_executesql N'SELECT
A.* FROM TableA A
INNER JOIN @dbName..TableB B ON A.C1 = B.C1
WHERE B.C2 = @ptr',N'@BillingRunID int,@AccountID int,@dbName nvarchar(4000)',@ptr=1001,@dbName=N'Student'
我遇到的问题是我在 .net 项目中有查询,并且在其他过程中使用 sp_executesql 调用它,因为 SQL 不能作为 proc 或任何其他方式移动到数据库中。有没有办法解决这个问题?
解决方案
您不能参数化对象名称,它必须被安全地注入。你可以这样实现:
DECLARE @dbname sysname, --Obviously this'll be assigned somewhere
@SQL nvarchar(MAX),
@CRLF nchar(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'SELECT A.*' + @CRLF +
N'FROM dbo.Table A' + @CRLF +
N' INNER JOIN ' + QUOTENAME(@dbName) + N'.dbo.TableB B On A.C1 = B.C1' + @CRLF +
N'WHERE B.C2 = @ptr;';
--PRINT @SQL; --Your best friend
--Oddly, only @ptr is in your script, but it isn't defined in the second parameter.
--I therefore don't know what data type it needs to be.
EXEC sys.sp_executesql @SQL, N'@prt {Your Datatype}', @ptr;
推荐阅读
- amazon-web-services - 自动配置新的 Kubernetes 节点
- php - 更新表中的一行,同时从另一个表中选择另一行以显示更新位置
- .net-core - 在 .Net Core 3.1 应用程序中的 ExecuteAsync 中等待后的后台服务块
- azure-devops - Azure Devops 流程模板 XML 自定义控制标记
- javascript - 如何修复我的代码在 javascript 中只运行一次
- spring - Spring 和 React Native - 推送通知?
- wordpress - WordPress - 添加新分类术语时“抱歉,您不能这样做”
- google-cloud-platform - GCP API 网关:无法使用路径参数
- python - keras模型的合并,输入输出问题
- ruby - Sequel Ruby 读取 bytea 数据类型