【问题标题】:dynamic SQL : use variable declared in a string, outside of the string动态 SQL:使用在字符串中声明的变量,在字符串之外
【发布时间】:2015-10-02 13:36:13
【问题描述】:

我有一个应该计算一个人年龄的存储过程。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

alter PROCEDURE [dbo].[ageTest] 
(
 @curDate date 
 )
AS
BEGIN
    SET NOCOUNT ON;
declare @sql nvarchar(max)
declare @params nvarchar (1000) 

declare @age date

set @params = N' @curDate date , @age date output'
set @sql = '
declare @dif float 
declare @ageRound int
declare @theAge varchar (100)
set @age = ''19890406''
set @theAge =(select (datediff (mm, @age , getdate()))) 
set @dif = @theAge % 12
set @ageRound = cast (@theAge as float)/12 
select @ageRound as Years, @dif as months  
'

set @sql = replace (@sql, '19890406', @curDate)
execute sp_executesql @sql, @params, @curDate, @age output

end

execute [dbo].[ageTest] '19511214'

我想要得到的是两列:

Years     Months
63         10

现在它看起来像这样:

问题是它循环。我可能应该从@sql 中删除选择并将其放在外面,然后我遇到了声明问题。想法?

编辑:不重复

【问题讨论】:

  • 你为什么还要为此使用动态 sql?
  • 只是为了好玩,我正在尝试自己了解更多信息。我只想能够执行它并传递一个日期。我正在努力为自己寻找新的挑战。这就是我今天要做的。那么,为什么不呢?否则你会怎么做?作为您传递日期的存储过程?
  • 这不是重复的,我只是在30分钟前写了这个程序,没有看任何网站。好的,不得不谷歌演员,但就是这样\
  • 您正在从内部调用该过程,因为您的过程后没有批处理分隔符。默认为 GO。
  • 我会从动态 sql 中提取所有内容。而且我不会使用浮点数。浮点数据类型是一个近似值,您应该改用数字。而且存储过程应该很简单。

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

如果您真的只是一个初学者。

首先,您应该始终在您的程序中使用TRY...CATCH 块。

以下是您在代码中所做的快速重写:

-- =============================================
-- Procedure Name   : dbo.ageTest
-- Usage Example    : EXECUTE [dbo].[ageTest] '19511214';
-- =============================================
ALTER PROCEDURE [dbo].[ageTest]
(
    @curDate DATE
)
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN TRY
        SELECT DATEDIFF(MM, @curDate, CURRENT_TIMESTAMP) / 12 AS Years
            , DATEDIFF(MM, @curDate, CURRENT_TIMESTAMP) % 12 AS Months;
    END TRY
    BEGIN CATCH
        SELECT ERROR_NUMBER(), ERROR_MESSAGE();
    END CATCH
END

它显示了您应该如何在 SP 中使用参数。

【讨论】:

  • 哦,谢谢yolu!我4个月前从0开始sql。刚进入存储过程并没有尝试太多。我很高兴我什至可以在短时间内让那个东西运行起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 2012-04-25
  • 2023-03-23
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多