Sql-Server

FUNCTION 錯誤(SQL Server 2008)-“找不到任何一列…”

  • September 15, 2015

我有這個功能:

CREATE FUNCTION [dbo].[fn_xxx]
   (
   @Nome VARCHAR(100),
   @Descricao VARCHAR(500)
   )
RETURNS @tbDados TABLE
   (
       Qtd INT
   )
AS
BEGIN
   DECLARE @CMD AS NVARCHAR(MAX);
   DECLARE @Tabela VARCHAR(100);
   DECLARE @CampoDescricao VARCHAR(100);

   --- *** Identifica os campos e tabelas 
   SET @Tabela = 'tbl' + @Nome; 
   SET @CampoDescricao = 'Desc' + @Nome;

   SET @CMD = '
   INSERT INTO @tbDados (Qtd) 
   SELECT @Qtd = COUNT(*) 
   FROM ' + @Tabela + ' 
   WHERE ' + @CampoDescricao + ' = ''' + replace(@Descricao, '''', '`') + ''';';

   EXEC sp_executesql @CMD;

   RETURN 
END 

我試圖在這裡幫助開發人員,但沒有成功。

當我們執行它(select dbo.fn_xxx ('processador','teste'))它給我們這個錯誤:

找不到列“dbo”或使用者定義的函式或聚合“dbo.fn_xxx”,或者名稱不明確。

我一直在網際網路上搜尋,並找到了一些結果,但都是關於程式碼的。

有人可以幫我找出這個函式中的這個錯誤嗎?

謝謝

編輯:

如果我執行它:

SELECT * FROM [EasyTablet].[dbo].[fn_xxx] (
   'processador','teste'
 )
GO

它向我顯示了這個錯誤:

只有函式和一些擴展儲存過程可以在函式內執行。

您不能在函式內使用動態 SQL(好吧,除了這個可怕的 hack之外)。主要原因是函式只能返回數據,不能有副作用。SQL Server 無法阻止您向 sp_executesql 傳遞插入或更新(順便說一句,無論您最終如何實現它,這看起來都像是一個 SQL 注入攻擊向量)。

我不清楚您為什麼首先將其作為多語句 TVF 來執行。您將返回一列和一行。為什麼不使用帶有輸出參數的儲存過程?

引用自:https://dba.stackexchange.com/questions/94042