带有参数的链接服务器的存储过程 - 错误
Stored procedure to Linked server with parameters - Error
我正在尝试为链接服务器创建存储过程,其中输入参数@ServerName 是我使用的链接服务器的名称。
在此过程中,我还声明了我想从动态 SQL 查询和行中获取哪个值的参数。
CREATE PROC sp_Version @ServerName varchar(30)
as
Declare @Ver varchar(10)
exec ('select @Ver from openquery(' + @ServerName + ', ''SELECT SUBSTRING (@@VERSION, 22, 7) = @Ver''')
当我执行我的 sp 时,我收到一条错误消息:
"Must declare the scalar variable "@Ver"."
你能帮帮我吗?
我不确定您使用@Ver 的值的目的是什么,也许是 OUTPUT
参数?如果是这样,那么语法将是:
CREATE PROC GetVersion @ServerName varchar(30), @Ver nvarchar(500) OUTPUT AS
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT @dVer = Version' + NCHAR(10) +
N'FROM OPENROWSET(''SQLNCLI'',' + NCHAR(10) +
N' ' + QUOTENAME('Server=' + @ServerName + ';Trusted_Connection=YES;','''') + ',' +NCHAR(10) +
N' ''SELECT @@VERSION AS Version'');';
PRINT @SQL;
EXEC sp_executesql @SQL, N'@dVer nvarchar(500) OUTPUT', @dVer = @Ver OUTPUT;
GO
DECLARE @ver varchar(500)
EXEC GetVersion 'YourServerName', @ver OUTPUT;
PRINT @ver;
GO
DROP PROC GetVersion;
请注意,首先,按照建议我没有使用 sp_
前缀。我还使用了 sp_executesql
而不是简单的 EXEC
(这通常是更好的做法,因为你可以参数化你的动态 SQL 然后,就像我所做的那样),以及 QUOTENAME
尽量避免注射。
这种情况我遇到过几次。试试这个:
CREATE PROC sp_Version @ServerName varchar(30)
as
Declare @Ver varchar(10)
DECLARE @SqlCommand nvarchar(MAX)
SET @SqlCommand = 'SELECT @Ver2 = SUBSTRING (@@VERSION, 22, 7) '
DECLARE @sp_executesql VARCHAR(100)
SET @sp_executesql = @ServerName + '.master.sys.sp_executesql'
EXEC @sp_executesql @SqlCommand, N'@Ver2 nvarchar(10) out', @Ver out
SELECT @Ver
我正在尝试为链接服务器创建存储过程,其中输入参数@ServerName 是我使用的链接服务器的名称。 在此过程中,我还声明了我想从动态 SQL 查询和行中获取哪个值的参数。
CREATE PROC sp_Version @ServerName varchar(30)
as
Declare @Ver varchar(10)
exec ('select @Ver from openquery(' + @ServerName + ', ''SELECT SUBSTRING (@@VERSION, 22, 7) = @Ver''')
当我执行我的 sp 时,我收到一条错误消息:
"Must declare the scalar variable "@Ver"."
你能帮帮我吗?
我不确定您使用@Ver 的值的目的是什么,也许是 OUTPUT
参数?如果是这样,那么语法将是:
CREATE PROC GetVersion @ServerName varchar(30), @Ver nvarchar(500) OUTPUT AS
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'SELECT @dVer = Version' + NCHAR(10) +
N'FROM OPENROWSET(''SQLNCLI'',' + NCHAR(10) +
N' ' + QUOTENAME('Server=' + @ServerName + ';Trusted_Connection=YES;','''') + ',' +NCHAR(10) +
N' ''SELECT @@VERSION AS Version'');';
PRINT @SQL;
EXEC sp_executesql @SQL, N'@dVer nvarchar(500) OUTPUT', @dVer = @Ver OUTPUT;
GO
DECLARE @ver varchar(500)
EXEC GetVersion 'YourServerName', @ver OUTPUT;
PRINT @ver;
GO
DROP PROC GetVersion;
请注意,首先,按照建议我没有使用 sp_
前缀。我还使用了 sp_executesql
而不是简单的 EXEC
(这通常是更好的做法,因为你可以参数化你的动态 SQL 然后,就像我所做的那样),以及 QUOTENAME
尽量避免注射。
这种情况我遇到过几次。试试这个:
CREATE PROC sp_Version @ServerName varchar(30)
as
Declare @Ver varchar(10)
DECLARE @SqlCommand nvarchar(MAX)
SET @SqlCommand = 'SELECT @Ver2 = SUBSTRING (@@VERSION, 22, 7) '
DECLARE @sp_executesql VARCHAR(100)
SET @sp_executesql = @ServerName + '.master.sys.sp_executesql'
EXEC @sp_executesql @SqlCommand, N'@Ver2 nvarchar(10) out', @Ver out
SELECT @Ver