Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用MS SQL Server中存储过程的输出初始化变量_Sql Server_Sql Server 2005_Tsql_Stored Procedures - Fatal编程技术网

Sql server 使用MS SQL Server中存储过程的输出初始化变量

Sql server 使用MS SQL Server中存储过程的输出初始化变量,sql-server,sql-server-2005,tsql,stored-procedures,Sql Server,Sql Server 2005,Tsql,Stored Procedures,我创建了以下存储过程 CREATE PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPESTARTUP] ( @CODE CHAR(5) , @DESC VARCHAR(255) OUTPUT ) AS DECLARE @SERVERNAME nvarchar(30) DECLARE @DBASE nvarchar(30) DECLARE @SQL nvarchar(2000) SET @SERVERNAME = Convert(nvarchar, (SEL

我创建了以下存储过程

CREATE PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPESTARTUP]
(
  @CODE CHAR(5)
  , @DESC VARCHAR(255) OUTPUT
)
AS
DECLARE @SERVERNAME nvarchar(30)
DECLARE @DBASE nvarchar(30)
DECLARE @SQL nvarchar(2000)

SET @SERVERNAME = 
  Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSSERVER'))
SET @DBASE = 
  Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSDBNAME'))

SET @SQL = 
  'SELECT clnt_cat_desc FROM ' + @SERVERNAME + 
  '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N''
  AND clnt_cat_code = ''' + @CODE + ''''

EXECUTE sp_executeSQL @SQL

RETURN
此过程用于许多不同的数据库和服务器,并作为动态SQL编写,以简化维护。该过程也运行在与该过程所指向的服务器不同的服务器上

我想将此过程的输出用作表中的值

DECLARE @clid BIGINT
DECLARE @fileid BIGINT
DECLARE @myCode CHAR(5)
DECLARE @myDesc VARCHAR(255)
DECLARE @@tempDesc VARCHAR(255)

SET @clid = 1831400022
SET @fileid = 2072551358
SET @myCode = 
  (SELECT _clientPrimBusinessType FROM udbhextclient WHERE clid = @clid)

SET @myDesc = 
  EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT
----------------------------------------------------------------------------
SELECT
  a.clid
  , b.fileid
  , c.usrfullname AS ClientPartner
  , e.usrfullname AS ClientFeeEarner
  , @myDesc AS ClientPrimaryBusinessType
FROM 
  dbclient a
    INNER JOIN
  dbFile b
    ON
  a.clid = b.clid
    INNER JOIN
  dbuser c
    ON 
  a.feeusrid = c.usrid
    INNER JOIN
  udbhextclient d
    ON
  a.clid = d.clid
    INNER JOIN
  dbuser e
    ON
  d._ClientFeeEarner = e.usrid
WHERE 
  a.clid = @clid
  AND b.fileid = @fileid
我知道这是不正确的语法,但您可以看到我试图在不使用临时表的情况下实现这一点,因为这意味着在30个不同的服务器上进行维护,每个服务器上有3到5个数据库

Smink-尝试了您的解决方案并获得以下结果


您可以创建一个函数,而不是返回表的过程

CREATE FUNCTION [dbo].[my_function]
(
   @par2     UNIQUEIDENTIFIER, 
   @par2     UNIQUEIDENTIFIER,
   @par3     UNIQUEIDENTIFIER
)
RETURNS @returntable TABLE 
(
   col1 UNIQUEIDENTIFIER,
   col2 NVARCHAR(50),
   col3 NVARCHAR(50)
)
AS
BEGIN
...
END

您可以创建一个函数,而不是返回表的过程

CREATE FUNCTION [dbo].[my_function]
(
   @par2     UNIQUEIDENTIFIER, 
   @par2     UNIQUEIDENTIFIER,
   @par3     UNIQUEIDENTIFIER
)
RETURNS @returntable TABLE 
(
   col1 UNIQUEIDENTIFIER,
   col2 NVARCHAR(50),
   col3 NVARCHAR(50)
)
AS
BEGIN
...
END

如果您不想接触您的过程,您可以创建一个包装它的函数,并在查询中使用该包装函数。

如果您不想接触您的过程,您可以创建一个包装它的函数,并在查询中使用该包装函数。

更改行:

SET @myDesc = 
  EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT

而且您没有在存储过程中分配@DESC

SET @SQL = 
  'SELECT @DESC = clnt_cat_desc FROM ' + @SERVERNAME + 
  '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N''
  AND clnt_cat_code = ''' + @CODE + ''''

EXECUTE sp_executeSQL @SQL, N'@DESC varchar(255) output', @DESC output
然后,应在下一选择中使用@tempDesc:

SELECT
  a.clid
  , b.fileid
  , c.usrfullname AS ClientPartner
  , e.usrfullname AS ClientFeeEarner
  , @tempDesc AS ClientPrimaryBusinessType
此外,您的存储过程还允许SQL注入:

SET @SQL = 
  'SELECT clnt_cat_desc 
     FROM ' + QUOTENAME(@SERVERNAME) + '.' + QUOTENAME(@DBASE) + '.dbo.hbl_clnt_cat
    WHERE inactive = ''N''
      AND clnt_cat_code = @CODE'

EXECUTE sp_executeSQL @SQL, N'@CODE CHAR(5)', @CODE
更新:修复了SQL注入问题。

更改行:

SET @myDesc = 
  EXEC UDSPRBHPRIMBUSTYPESTARTUP @CODE = @myCode, @DESC = @@tempDesc OUTPUT

而且您没有在存储过程中分配@DESC

SET @SQL = 
  'SELECT @DESC = clnt_cat_desc FROM ' + @SERVERNAME + 
  '.' + @DBASE + '.dbo.hbl_clnt_cat WHERE inactive = ''N''
  AND clnt_cat_code = ''' + @CODE + ''''

EXECUTE sp_executeSQL @SQL, N'@DESC varchar(255) output', @DESC output
然后,应在下一选择中使用@tempDesc:

SELECT
  a.clid
  , b.fileid
  , c.usrfullname AS ClientPartner
  , e.usrfullname AS ClientFeeEarner
  , @tempDesc AS ClientPrimaryBusinessType
此外,您的存储过程还允许SQL注入:

SET @SQL = 
  'SELECT clnt_cat_desc 
     FROM ' + QUOTENAME(@SERVERNAME) + '.' + QUOTENAME(@DBASE) + '.dbo.hbl_clnt_cat
    WHERE inactive = ''N''
      AND clnt_cat_code = @CODE'

EXECUTE sp_executeSQL @SQL, N'@CODE CHAR(5)', @CODE


更新:修复了SQL注入问题。

Pheww,我对如何实现这一点非常着迷,我需要将存储过程的结果作为当前查询的一部分,这是我最难做到的。我所做的是用一个函数包装过程,然后返回值,就是这样。

Pheww,我对如何做到这一点非常着迷,我需要将存储过程的结果作为当前查询的一部分,这是我最难做到的。我所做的是用一个函数包装这个过程,然后返回值,就这样。

Wow!这个名字怎么发音:udsprbhprimbustypestruptup这个软件包有很多更新。除非遵循命名约定,否则更新过程将删除所有内容。。。UD-用户定义,SPR-存储过程,BH-Boodle-Hatfieldemployer,PRIM-主总线-业务类型-启动类型-启动一些甚至有一个最大字符长度为15的完整答案如下。“看一看。”Aaron Bertrand:“我收到你的信息了。我会考虑的。”Aaron Bertrand:非常感谢你的关注。大师,这一变化增加了代码的可读性。当然这是我的意见。不过,我会尊重你的意见。我想提醒你注意。哇!这个名字怎么发音:udsprbhprimbustypestruptup这个软件包有很多更新。除非遵循命名约定,否则更新过程将删除所有内容。。。UD-用户定义,SPR-存储过程,BH-Boodle-Hatfieldemployer,PRIM-主总线-业务类型-启动类型-启动一些甚至有一个最大字符长度为15的完整答案如下。“看一看。”Aaron Bertrand:“我收到你的信息了。我会考虑的。”Aaron Bertrand:非常感谢你的关注。大师,这一变化增加了代码的可读性。当然这是我的意见。不过,我会尊重你的意见。我试图提醒您注意。这会返回结果,但不会将值放入下面的语句中。您应该在select中使用@tempDesc,而不是@myDesc。请参阅编辑后的答案。Smink-我尝试了您的解决方案并得到以下结果。。。请查看嵌入的映像。您没有在[dbo].[UDSPRBHPRIMBUSTYPESTARTUP]存储过程中分配@DESC。当您更改。。。执行sp_executeSQL@SQL,N'@DESC varchar255 output',@DESC to。。。执行sp_executeSQL@SQL,N'@DESC varchar255 output',@DESC=@DESC output您可以编辑您的答案,以便我将其标记为已接受吗?提前感谢。这会返回结果,但不会将值放入下面的语句中。您应该在select中使用@tempDesc,而不是@myDesc。请参阅编辑后的答案。Smink-我尝试了您的解决方案并得到以下结果。。。请查看嵌入的映像。您没有在[dbo].[UDSPRBHPRIMBUSTYPESTARTUP]存储过程中分配@DESC。当您更改。。。执行sp_executeSQL@SQL,N'@DESC varchar255 output',@DESC to。。。执行sp_executeSQL@SQL,N'@DESC varchar255 output',@DESC=@DESC output您可以编辑您的答案,以便我将其标记为已接受吗?提前谢谢。