2011-07-23 37 views
1

我得到一个奇怪的例外,说:“ ”T-SQL的动态查询字符串限制

Msg 203, Level 16, State 2, Line 53 
The name 'SELECT 
     ISNULL(ESP.ID,-1) AS 'PayScaleID', 
     ISNULL(E.Prefix,'') + ISNULL(E.SerialNo,0) AS 'Token number', 
     ISNULL(E.FirstName,'')+' '+ ISNULL(E.MiddleName,'')+' '+ISNULL(E.LastName,'') AS 'Employee name', 
     ISNULL(E.CostCentreCode,'') AS 'Cost centre code', 
     ESP.TotalPresentDays AS 'Present days', 
     ESP.TotalWeeklyOffDays AS 'Week offs', 
     ESP.TotalPaidHolidays AS 'Paid holiDays', 
     ESP.TotalAbsentDays AS 'Absent days', 
     ESP.ArrearDays AS 'Arrear days', 
     ESP.OTHours AS 'OTHours', 
     ESP.TotalPaidAmount AS 'Total Amount', 
     MAD.Name AS 'Allowance' , 
     X.Amount 
    INTO #temp 
    FROM 
    (
     SELECT 
      -1 AS 'BillingI' is not a valid identifier." 

我执行下面的查询。 “

{

DECLARE @sql AS VARCHAR(8000) 

SET @sql = 'SELECT 
     ISNULL(ESP.ID,-1) AS ''PayScaleID'', 
     ISNULL(E.Prefix,'''') + ISNULL(E.SerialNo,0) AS ''Token number'', 
     ISNULL(E.FirstName,'''')+'' ''+ ISNULL(E.MiddleName,'''')+'' ''+ISNULL(E.LastName,'''') AS ''Employee name'', 
     ISNULL(E.CostCentreCode,'''') AS ''Cost centre code'', 
     ESP.TotalPresentDays AS ''Present days'', 
     ESP.TotalWeeklyOffDays AS ''Week offs'', 
     ESP.TotalPaidHolidays AS ''Paid holiDays'', 
     ESP.TotalAbsentDays AS ''Absent days'', 
     ESP.ArrearDays AS ''Arrear days'', 
     ESP.OTHours AS ''OTHours'', 
     ESP.TotalPaidAmount AS ''Total Amount'', 
     MAD.Name AS ''Allowance'' , 
     X.Amount 
    INTO #temp 
    FROM 
    (
     SELECT 
      -1 AS ''BillingID'', 
      ESP.ID AS ''EmployeeSalaryPaidID'', 
      MAd.ID AS ''AllowanceID'', 
      ESPD.PaidAmount AS ''Amount'' 
     FROM Employee_SalaryPaid ESP 
     INNER JOIN Employee_SalaryPaidDetails ESPD ON ESPD.EmployeeSalaryPaidID = ESP.ID 
     INNER JOIN Employee E ON E.ID = ESP.EmployeeID 
     INNER JOIN Master_AllowanceDeduction MAD ON MAD.ID = ESPD.AllowanceDeductionID 
     WHERE ESP.YearAndMonth =201104 
     UNION ALL 
     SELECT 
      CBR.ID AS ''BillingID'', 
      CBRD.EmployeeSalaryPaidID, 
      CBRD.AllowanceDeductionID AS ''AllowanceID'', 
      CBRD.Amount AS ''Amount'' 

     FROM Company_BillRaised CBR 
     INNER JOIN Company_BillRaisedDetails CBRD ON CBRD.BillRaisedID = CBR.ID 
     WHERE CBR.MonthYear =201104 
    )X 
    INNER JOIN Master_AllowanceDeduction MAD ON MAD.ID = X.AllowanceID 
    INNER JOIN Employee_SalaryPaid ESP ON ESP.ID =X.EmployeeSalaryPaidID 
    INNER JOIN Employee E ON E.ID= ESP.EmployeeID 
    INNER JOIN dbo.vw_CompanyEmployeeIDs CE ON CE.EmployeeID = E.ID 
    WHERE CE.BranchID =73 
DROP TABLE #temp' 

EXEC @sql 

}

我不明白究竟是什么问题?我们有字符的一些限制,而执行动态SQL就像我现在这样。我试着打印我是什么在获得@sql,我能得到我所期待的结果。但是,当我再这样下去使用EXEC @sql它给我的错误。

有什么建议?

+1

你有没有考虑过的位选择答案? 5个问题,0个学分。人们在这里免费工作只获得积分作为付款。你至少可以做的就是在信用到期时给予信用 –

回答

4

尝试将您的最后一行更改为EXEC (@sql)

Execute a character string 
{ EXEC | EXECUTE } 
    ({ @string_variable | [ N ]'tsql_string' } [ + ...n ]) 
    [ AS { LOGIN | USER } = ' name ' ] 
[;] 

来源:然后,而不是

+0

EXEC @Sql和EXEC(@Sql)的区别是什么。请你能告诉我哪一个更好,为什么? –

+1

@Raj Jayaswal:没有括号'@ Sql'被认为包含您打算执行的存储过程的名称。 –

+0

感谢您的信息。 –

1

您可以使用:

  1. 执行或者exec:EXEC (@sql)

  2. 存储过程sp_execute系统。优点:可在此语法使用额外的参数,并在执行前验证数据类型:execute sp_execute @sql