如何在sql Server上保存sql语句

如何在sql Server上保存sql语句,sql,sql-server,function,stored-procedures,Sql,Sql Server,Function,Stored Procedures,我试图在SQLServer上保存我的SQL语句,而不是将其键入我的C代码中。我的问题是这个SQL语句应该保存为什么?我曾尝试将其保存为表值函数和存储过程,但失败了。是否有其他方法将其保存到SQL Server中 我的声明如下: DECLARE @PickupDate datetime DECLARE @SendingID int DECLARE @PickupCountryID int, @PickupPostalID int, @PickupStreetID int, @PickupAdrI

我试图在SQLServer上保存我的SQL语句,而不是将其键入我的C代码中。我的问题是这个SQL语句应该保存为什么?我曾尝试将其保存为表值函数和存储过程,但失败了。是否有其他方法将其保存到SQL Server中

我的声明如下:

DECLARE @PickupDate datetime
DECLARE @SendingID int
DECLARE @PickupCountryID int, @PickupPostalID int, @PickupStreetID int,  @PickupAdrID int;
DECLARE @DeliveryCountryID int, @DeliveryPostalID int,  @DeliveryStreetID int, @DeliveryAdrID int, @PickupType varchar(2) 
DECLARE @RouteID int, @RoutePartNo int
DECLARE @weekday varchar(50)
DECLARE caclulate_pickup_route CURSOR FOR
SELECT 
      SendingID, 
      PickupPostal.CountryID,
      PickupStreet.PostalID,
      PickupAdr.StreetID,
      PickupAdrID,
      PickupDate,
      PickupType,
      DeliveryPostal.CountryID,
      DeliveryStreet.PostalID,
      DeliveryAdr.StreetID,
      DeliveryAdrID
      FROM Sending
      INNER JOIN Adr AS PickupAdr ON PickupAdrID=PickupAdr.AdrID 
      INNER JOIN Street AS PickupStreet ON PickupAdr.StreetID=PickupStreet.StreetID
      INNER JOIN Postal AS PickupPostal ON PickupStreet.PostalID=PickupPostal.PostalID
      INNER JOIN Adr AS DeliveryAdr ON DeliveryAdrID=DeliveryAdr.AdrID
      INNER JOIN Street AS DeliveryStreet ON DeliveryAdr.StreetID=DeliveryStreet.StreetID
      INNER JOIN Postal AS DeliveryPostal ON DeliveryStreet.PostalID=DeliveryPostal.PostalID
      WHERE PickupRouteID=0 --and DeliveryDate = '2013-07-31' and DeliveryType = 'N'

OPEN caclulate_pickup_route
FETCH NEXT FROM caclulate_pickup_route INTO  @SendingID, @PickupCountryID,@PickupPostalID, @PickupStreetID, @PickupAdrID, @PickupDate, @PickupType,
                                    @DeliveryCountryID, @DeliveryPostalID, @DeliveryStreetID, @DeliveryAdrID

WHILE @@FETCH_STATUS = 0
BEGIN
SET @weekday = DATENAME(weekday, dateadd(day,-1, @PickupDate))
SELECT @RouteID = RouteID, @RoutepartNo = RoutePartNo FROM RoutePartPart AS RoutePartPart WHERE
  PickupAreaGrpID IN (SELECT AreaGrpID AS PickupAreaGrpID FROM AreaGrpSpec WHERE 
 (CountryID=@PickupCountryID OR PostalID=@PickupPostalID OR (PostalID IN 
 (SELECT PostalID FROM Postal WHERE 
  Postal<=(SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID) AND 
  CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)) AND PostalIDto IN 
 (SELECT PostalID FROM Postal WHERE Postal>=(SELECT Postal FROM Postal WHERE 
  PostalID=@PickupPostalID) AND CountryID=(SELECT CountryID FROM Postal WHERE 
  PostalID=@PickupPostalID))) OR StreetID=@PickupStreetID OR AdrID=@PickupAdrID) AND DenyType=0) AND

  PickupAreaGrpID NOT IN 
 (SELECT AreaGrpID AS PickupAreaGrpID FROM AreaGrpSpec WHERE 
 (CountryID=@PickupCountryID OR PostalID=@PickupPostalID OR (PostalID IN 
 (SELECT PostalID FROM Postal WHERE Postal<=(SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID) AND 
  CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)) AND PostalIDto IN 
 (SELECT PostalID FROM Postal WHERE Postal>=(SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID) AND 
  CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID))) OR StreetID=@PickupStreetID OR AdrID=@PickupAdrID) AND DenyType=1) AND
  DeliveryAreaGrpID IN 
 (SELECT AreaGrpID AS DeliveryAreaGrpID FROM AreaGrpSpec WHERE 
 (CountryID=@DeliveryCountryID OR PostalID=@DeliveryPostalID OR (PostalID IN 
 (SELECT PostalID FROM Postal WHERE Postal<=(SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID) AND 
  CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID)) AND PostalIDto IN 
 (SELECT PostalID FROM Postal WHERE Postal>=(SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID) AND 
  CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID))) OR StreetID=@DeliveryStreetID OR AdrID=@DeliveryAdrID) AND DenyType=0) AND
  DeliveryAreaGrpID NOT IN 
 (SELECT AreaGrpID AS DeliveryAreaGrpID FROM AreaGrpSpec WHERE 
 (CountryID=@DeliveryCountryID OR PostalID=@DeliveryPostalID OR (PostalID IN (SELECT PostalID FROM Postal WHERE 
  Postal<=(SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID) AND CountryID=(SELECT CountryID FROM Postal WHERE 
  PostalID=@DeliveryPostalID)) AND PostalIDto IN (SELECT PostalID FROM Postal WHERE Postal>=(SELECT Postal FROM Postal WHERE 
  PostalID=@DeliveryPostalID) AND CountryID=(SELECT CountryID FROM Postal WHERE
  PostalID=@DeliveryPostalID))) OR StreetID=@DeliveryStreetID OR AdrID=@DeliveryAdrID) AND DenyType=1) AND
  Pickup=1 AND(
    (@weekday = 'Monday' AND [Monday] = 1)
          OR (@weekday = 'Tuesday' AND [Tuesday] = 1)
          OR (@weekday = 'Wednesday' AND [Wednesday] = 1)
          OR (@weekday = 'Thursday' AND [Thursday] = 1)
          OR (@weekday = 'Friday' AND [Friday] = 1)
          OR (@weekday = 'Saturday' AND [Saturday] = 1)
          OR (@weekday = 'Sunday' AND [Sunday] = 1))AND

  Types LIKE '%'+@PickupType+'%'

Update Sending SET PickupRouteID=@RouteID, PickupRoutePartNo=@RoutePartNo WHERE SendingID=@SendingID

FETCH NEXT FROM caclulate_pickup_route INTO @SendingID, @PickupCountryID,@PickupPostalID, @PickupStreetID, @PickupAdrID, @PickupDate, @PickupType,
                                            @DeliveryCountryID, @DeliveryPostalID, @DeliveryStreetID, @DeliveryAdrID
END
CLOSE caclulate_pickup_route
DEALLOCATE  caclulate_pickup_route

谢谢

在发布问题后,我想出了如何将其保存为存储过程

这是我的存储过程:

USE [database]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Calculate_Delivery_Routes] 
    -- Add the parameters for the stored procedure here
AS
BEGIN
SET NOCOUNT ON;
DECLARE @DeliveryDate datetime
DECLARE @SendingID int
DECLARE @PickupCountryID int, @PickupPostalID int, @PickupStreetID int,  @PickupAdrID int;
DECLARE @DeliveryCountryID int, @DeliveryPostalID int,  @DeliveryStreetID int, @DeliveryAdrID int, @DeliveryType varchar(2)
DECLARE @RouteID int, @RoutePartNo int
DECLARE @weekday varchar(50)
DECLARE caclulate_delivery_route CURSOR FOR
SELECT 
      SendingID,
      PickupPostal.CountryID,
      PickupStreet.PostalID,
      PickupAdr.StreetID,
      PickupAdrID,
      DeliveryDate,
      DeliveryType,
      DeliveryPostal.CountryID,
      DeliveryStreet.PostalID,
      DeliveryAdr.StreetID,
      DeliveryAdrID
      FROM Sending
      INNER JOIN Adr AS PickupAdr ON PickupAdrID=PickupAdr.AdrID
      INNER JOIN Street AS PickupStreet ON PickupAdr.StreetID=PickupStreet.StreetID
      INNER JOIN Postal AS PickupPostal ON PickupStreet.PostalID=PickupPostal.PostalID
      INNER JOIN Adr AS DeliveryAdr ON DeliveryAdrID=DeliveryAdr.AdrID
      INNER JOIN Street AS DeliveryStreet ON DeliveryAdr.StreetID=DeliveryStreet.StreetID
      INNER JOIN Postal AS DeliveryPostal ON DeliveryStreet.PostalID=DeliveryPostal.PostalID
      WHERE DeliveryRouteID=0 --and DeliveryDate = '2013-07-31' and DeliveryType = 'N'

OPEN caclulate_delivery_route
FETCH NEXT FROM caclulate_delivery_route INTO @SendingID, @PickupCountryID,@PickupPostalID, @PickupStreetID, @PickupAdrID, @DeliveryDate, @DeliveryType,
                                              @DeliveryCountryID, @DeliveryPostalID, @DeliveryStreetID, @DeliveryAdrID

WHILE @@FETCH_STATUS = 0
BEGIN
SET @weekday = DATENAME(weekday, dateadd(day,-1, @DeliveryDate))
SELECT @RouteID = RouteID, @RoutePartNo = RoutePartNo FROM RoutePartPart AS RoutePartPart WHERE
  PickupAreaGrpID IN (
  SELECT AreaGrpID AS PickupAreaGrpID FROM AreaGrpSpec 
  WHERE (CountryID=@PickupCountryID OR PostalID=@PickupPostalID OR (PostalID IN (
  SELECT PostalID FROM Postal WHERE Postal<=(SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID)
  AND CountryID=(
  SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)
  ) AND PostalIDto IN (SELECT PostalID FROM Postal WHERE Postal>=
  (SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID)
  AND CountryID=
  (SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)
  )
  ) OR StreetID=@PickupStreetID OR AdrID=@PickupAdrID) AND DenyType=0) AND
  PickupAreaGrpID NOT IN (SELECT AreaGrpID AS PickupAreaGrpID FROM AreaGrpSpec WHERE 
  (CountryID=@PickupCountryID OR PostalID=@PickupPostalID OR 
  (PostalID IN 
  (SELECT PostalID FROM Postal WHERE Postal<=
  (  SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID)
  AND CountryID=
  (SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)
  ) AND PostalIDto IN 
  (SELECT PostalID FROM Postal WHERE Postal>=
  (SELECT Postal FROM Postal WHERE PostalID=@PickupPostalID)
  AND CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@PickupPostalID)
  )
  )
  OR StreetID=@PickupStreetID OR AdrID=@PickupAdrID) AND DenyType=1) AND

  DeliveryAreaGrpID IN 
  (SELECT AreaGrpID AS DeliveryAreaGrpID FROM AreaGrpSpec WHERE 
  (CountryID=@DeliveryCountryID OR PostalID=@DeliveryPostalID OR 
  (PostalID IN (SELECT PostalID FROM Postal WHERE Postal<=
  (SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID) 
  AND CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID)
  ) AND PostalIDto IN 
  (SELECT PostalID FROM Postal WHERE Postal>=
  (SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID)
  AND CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID)
  )
  ) OR StreetID=@DeliveryStreetID OR AdrID=@DeliveryAdrID) AND DenyType=0) 
AND  DeliveryAreaGrpID NOT IN 
  (SELECT AreaGrpID AS DeliveryAreaGrpID FROM AreaGrpSpec WHERE 
  (CountryID=@DeliveryCountryID OR PostalID=@DeliveryPostalID OR 
  (PostalID IN (SELECT PostalID FROM Postal WHERE Postal<=
  (SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID)
  AND CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID)
  ) AND PostalIDto IN 
  (SELECT PostalID FROM Postal WHERE Postal>=
  (SELECT Postal FROM Postal WHERE PostalID=@DeliveryPostalID)
  AND CountryID=(SELECT CountryID FROM Postal WHERE PostalID=@DeliveryPostalID)
  )
  ) OR StreetID=@DeliveryStreetID OR AdrID=@DeliveryAdrID) AND DenyType=1) AND  Delivery=1 
 AND(
    (@weekday = 'Monday' AND [Monday] = 1)
          OR (@weekday = 'Tuesday' AND [Tuesday] = 1)
          OR (@weekday = 'Wednesday' AND [Wednesday] = 1)
          OR (@weekday = 'Thursday' AND [Thursday] = 1)
          OR (@weekday = 'Friday' AND [Friday] = 1)
          OR (@weekday = 'Saturday' AND [Saturday] = 1)
          OR (@weekday = 'Sunday' AND [Sunday] = 1))AND 
 Types LIKE '%'+@DeliveryType +'%'

UPDATE Sending SET DeliveryRouteID=@RouteID, DeliveryRoutePartNo=@RoutePartNo WHERE SendingID=@SendingID

FETCH NEXT FROM caclulate_delivery_route INTO @SendingID, @PickupCountryID,@PickupPostalID, @PickupStreetID, @PickupAdrID, @DeliveryDate, @DeliveryType,
                                              @DeliveryCountryID, @DeliveryPostalID, @DeliveryStreetID, @DeliveryAdrID

END
CLOSE caclulate_delivery_route
DEALLOCATE  caclulate_delivery_route
END

为什么存储过程不工作?上面写着什么?是的,我看不出有什么理由不把它作为一个SP@Lahib使用存储过程时必须考虑重写此代码。这是错误的,因为有很多原因。我在发帖后发现了我的问题。我现在已经开始工作了。对不起,伙计们!如果要重写代码并另存为SP,则应借此机会删除光标并替换为单个UPDATE语句。你似乎也有很多无关的选择。我很感激您最初没有编写这段代码,但为什么不让它更具性能和可维护性。@SteveFord,但我删除了光标,我如何更新多行??我对我的老板说了同样的话,他说没有必要对它进行优化:\n看一下来自。。。看一下这里的一些示例,包括带有通用表表达式的示例