gpt4 book ai didi

sql-server - 在 SQL 多部分标识符中连接数据库名称

转载 作者:行者123 更新时间:2023-12-02 17:20:31 24 4
gpt4 key购买 nike

我正在编写一个存储过程,我试图在 FROM 之后连接多部分标识符中的数据库名称,但没有成功。这是我尝试过但没有用的一种方法

INSERT INTO CONTROL_LOGISTICA.dbo.ITEMS_TRAMITE (NRODCTO, TIPODCTO, PRODUCTO, EMPRESA, CODUSUARIO, CODUBICA, CANTIDAD, CCHECK_HIJO) 
SELECT
@pNrodcto, @pTipodcto,
M.PRODUCTO, @pEmpresa, @pUsuario,
M.CODUBICA, M.CANTIDAD, 0
FROM
"@mEmpresa".dbo.MVTRADE M WITH(NOLOCK) -- Here I'm stuck
INNER JOIN
Dbo.vReporteMercia_ESP P ON P.PRODUCTO = M.PRODUCTO
WHERE
M.CANTIDAD <> 0 AND M.Origen = 'FAC'
AND M.NRODCTO = @pNrodcto AND M.TIPODCTO = @pTipodcto

我直接从存储过程中获取变量

@pEmpresa AS char(20)

我知道我可以做一个 IF 这样的

IF (@pEmpresa = 'John Doe')
BEGIN
--..... and the query here
END

是否可以使用变量连接数据库名称?如何?还是我应该只使用 IF

最佳答案

你将不得不使用动态 sql 来做类似的事情。

declare @sql nvarchar(max);
declare @params nvarchar(max);

set @params= N'@pNrodcto int, @pTipodcto int, @pUsuario int, @pEmpresa char(20)';

set @sql = N'INSERT INTO CONTROL_LOGISTICA.dbo.ITEMS_TRAMITE (NRODCTO, TIPODCTO, PRODUCTO, EMPRESA, CODUSUARIO, CODUBICA, CANTIDAD, CCHECK_HIJO)
SELECT @pNrodcto,@pTipodcto,M.PRODUCTO,@pEmpresa,@pUsuario,M.CODUBICA,M.CANTIDAD,0
FROM '+db_name(db_id(@pEmpresa))+'.dbo.MVTRADE M WITH(NOLOCK) --Here im stuck
INNER JOIN Dbo.vReporteMercia_ESP P ON P.PRODUCTO = M.PRODUCTO
WHERE M.CANTIDAD <> 0 AND M.Origen = ''FAC''
AND M.NRODCTO = @pNrodcto AND M.TIPODCTO = @pTipodcto';
exec sp_executesql @sql, @params, @pNrodcto, @pTipodcto, @pUsuario, @pEmpresa;

为避免直接将参数连接到已执行的 sql 字符串,我将参数包装在对 db_name()db_id() 的调用中。这将为无效的数据库名称返回 null,但不会阻止某人引用您不希望他们引用的数据库。考虑将参数值与白名单进行比较。

引用:

关于sql-server - 在 SQL 多部分标识符中连接数据库名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079674/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com