2016-12-07 73 views
3

我知道我們對這個問題有很多答案,但是我仍然不明白這個錯誤的真正原因。必須聲明標量變量「@serverName」

我已經創建了這樣的存儲過程。

CREATE PROCEDURE [dbo].[storedProc_dataPull] 
    @serverName nvarchar(30), 
    @dbName nvarchar (30), 
    @tblName nvarchar(30) 
AS BEGIN 
    DECLARE @sql nvarchar(500) 
    DECLARE @ds nvarchar(500) 

    SET @ds = 'Data Source=phmnldb16\eaudit;user id=YYYY;password=XXXX' 
    SET @sql = 'SELECT @serverName, @dbName, sdb1.* from 
       OPENDATASOURCE(''SQLOLEDB'', '+Char(39)+ @ds +Char(39)+ ').AUDIT_FSA_170_001.AUD170.Workflow sdb1)' 
    INSERT INTO sampleDatabase.dbo.WorkFlowCopy 
     ([ServerName] 
     ,[DBName] 
     ,[ID] 
     ,[ActivityDefinitionID] 
     ,[ParentID] 
     ,[Caption] 
     ,[Description] 
     ,[ShortDescription] 
     ,[Name] 
     ,[Order] 
     ,[ReferenceNumber] 
     ,[ShowOnNavigation] 
     ,[Status] 
     ,[InUseBy]) 

    EXEC (@sql) 

,當我試圖執行它..

EXEC storedProc_dataPull 'serverName', 'dbName', 'tblName' 

我總是得到這個錯誤:

Msg 137, Level 15, State 2, Line 1
Must declare the scalar variable "serverName"

+0

您不能從'EXEC(@sql)'內部訪問'@ serverName'(或任何其他變量),因爲它們是在它之外聲明的。動態SQL不能像那樣工作。 – Blorgbeard

+0

請參閱:http://stackoverflow.com/questions/28481189/exec-sp-executesql-with-multiple-parameters – Blorgbeard

+0

如果我不能從EXEC(@sql)訪問@serverName,那麼什麼是最好的解決方案那? – Jhe

回答

1

您使用@serverName作爲字符串的一部分。嘗試

SET @sql = 'SELECT ' + @serverName + ',' + @dbName + ', sdb1.* from 
      OPENDATASOURCE(''SQLOLEDB'','+Char(39)+ @ds + Char(39)+ ').AUDIT_FSA_170_001.AUD170.Workflow sdb1' 

,而不是

SET @sql = 'SELECT @serverName, @dbName, sdb1.* from 
      OPENDATASOURCE(''SQLOLEDB'', '+Char(39)+ @ds +Char(39)+ ').AUDIT_FSA_170_001.AUD170.Workflow sdb1)' 

我已經在@sql年底將額外的支架爲好。

3

使用SP_EXECUTESQL將值傳遞給參數的動態SQL

SET @sql = 'SELECT @serverName, @dbName, sdb1.* from 
       OPENDATASOURCE(''SQLOLEDB'', ' 
      + Char(39) + @ds + Char(39) 
      + ').AUDIT_FSA_170_001.AUD170.Workflow sdb1' -- unwanted close parenthesis 

INSERT INTO sampleDatabase.dbo.WorkFlowCopy 
      ([ServerName], 
      [DBName], 
      [ID], 
      [ActivityDefinitionID], 
      [ParentID], 
      [Caption], 
      [Description], 
      [ShortDescription], 
      [Name], 
      [Order], 
      [ReferenceNumber], 
      [ShowOnNavigation], 
      [Status], 
      [InUseBy]) -- Missing close parenthesis 
EXEC Sp_executesql 
    @sql, 
    N'@serverName nvarchar(30), @dbName nvarchar (30)', 
    @[email protected], 
    @[email protected] 

注意裏面:

  • Select列表你已經使用,*確保選擇列表返回相同的列數爲Insert列表順序相同
  • 有一個缺失關閉括號末尾的Insert列列表和不需要的右括號末尾的OPENDATASOURCE查詢
  • @tblName輸入參數未在過程中使用。