必须声明表变量(动态查询)

时间:2016-12-14 04:04:10

标签: sql sql-server sql-server-2008 stored-procedures dynamicquery

我有这样的存储过程。

ALTER PROCEDURE [dbo].[storedProc_dataPull] 
    @serverName nvarchar(30),
    @dbName nvarchar(30),
    @tblName nvarchar(30),
    @schemaName nvarchar (30),
    @userID nvarchar (30), 
    @password nvarchar (30),
    @sampleTbl nvarchar (30)
AS 
BEGIN
    DECLARE @schemaAndTbl nvarchar (39)

    SET @schemaAndTbl = @dbName + '.' + @schemaName + '.' +@tblName

    EXEC('INSERT INTO @sampleTbl 
       ([ID]
      ,[ActivityDefinitionID]
      ,[ParentID]
      ,[Caption]
      ,[Description]
      ,[ShortDescription]
      ,[Name]
      ,[Order]
      ,[ReferenceNumber]
      ,[ShowOnNavigation]
      ,[Status]
      ,[InUseBy]
      ,[ExpectedStartDate]
      ,[ActualStartDate]
      ,[ExpectedEndDate]

    SELECT * 
    FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='+@userID+';Password=' +@password+''').'+@schemaAndTbl+' sdb1')

    UPDATE @sampleTbl 
    SET ServerName = ''+@serverName+'', DBName = ''+@dbName+'' 
    WHERE ServerName IS NULL AND DBName IS NULL
END

当我试图执行时,我总是收到错误:

  

必须声明表变量

我的下一个问题是将列名作为参数传递。

SQL Server可以吗?我只想为我的应用程序创建一个动态存储过程。

3 个答案:

答案 0 :(得分:2)

您尚未在动态查询中声明@sampleTbl

表变量的范围仅限于批量执行。 Exec语句将批量执行语句。因此,声明,插入,选择&更新表变量必须且应该在同一批次中。意味着它应该包含EXEC语句内部。

第二个问题:我的下一个问题是将列名作为参数传递。

是的sp_executesql

可以

请查看sp_executesql (Transact-SQL)

答案 1 :(得分:1)

示例表@sampleTbl是存储过程中的参数。这也是类型nvarchar (30)。这是不正确的。我不明白你为什么想把这里的表作为参数传递。如果要将表作为参数传递,则应将其声明为TYPE,并将表作为READONLY传递。您将无法在该表中写入值。从参数中删除它并修改上述答案中提到的查询。它会工作..

快乐编码:)

答案 2 :(得分:0)

你可以修改你的陈述, 或者您可以根据表变量的结构定义自定义数据类型。你可以在sp_executesql

中使用
INSERT INTO @sampleTbl 
EXEC(' SELECT
   ([ID]
  ,[ActivityDefinitionID]
  ,[ParentID]
  ,[Caption]
  ,[Description]
  ,[ShortDescription]
  ,[Name]
  ,[Order]
  ,[ReferenceNumber]
  ,[ShowOnNavigation]
  ,[Status]
  ,[InUseBy]
  ,[ExpectedStartDate]
  ,[ActualStartDate]
  ,[ExpectedEndDate]

 SELECT * FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='+@userID+';Password=' +@password+''').'+@schemaAndTbl+' sdb1')