2016-12-07 9 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

Вы не можете получить доступ к '@ serverName' (или любой другой переменной) изнутри' EXEC (@sql) ', потому что они объявлены вне его. Динамический SQL не работает. – Blorgbeard

+0

См.: Http://stackoverflow.com/questions/28481189/exec-sp-executesql-with-multiple-parameters – Blorgbeard

+0

Если я не могу получить доступ к @serverName изнутри EXEC (@sql), то какое наилучшее решение для что? – 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 входной параметр не используется внутри процедуры.
Смежные вопросы