2017-05-09 39 views
0

我在「SQL Server Reporting Services 2012」上使用「Microsoft SQL Server Report Builder 3.0」。如何使用報表生成器3.0將SQL查詢中的列名作爲參數傳遞

從主報告main.rdl我打電話detail.rdl

鑽取報告main.rdl報告有一個表,該表的每個文本框中點擊,並鑽取操作。當用戶點擊任何文本框時,detail.rdl報告被調用。傳遞給detail.rdl報告的一個參數在SQL中用作列名稱。此SQL提取detail.rdl所需的數據報告

當我運行使用參數構建的detail.rdl報告的SQL查詢時,它不顯示任何錯誤,但也不提取任何數據。我認爲發生的事情是,因爲參數的數據類型爲Text,所以在SQL中用引號替換,這可能導致它無法獲取任何數據。

當我用參數值(不帶引號)替換列名後,直接在數據庫上運行相同的SQL時,它會提取數據。

是否有任何特定的方式來傳遞參數,這些參數將用作我在這裏丟失的列名稱?

SQL,我從報告生成嘗試:

SELECT 
    table_name.column1 
    ,table_name.column21 
    ,table_name.column15 
    ,table_name.column6 
    ,table_name.column9 
    ,table_name.column2 
    ,table_name.column19 
    ,@column --the value in this variable is an existing column name from table table_name 
FROM 
    table_name 
WHERE 
    table_name.column1 LIKE @company 
    AND table_name.column21 LIKE @platform 
    AND (@column is null OR @column = '' OR @column = 'N/A' OR @column = 'Unknown');--I want to use same variable here as well 

UPDATE: 我能夠通過行後加入

DECLARE @company varchar(10) 
SET @company = ''company_name'' 
DECLARE @platform varchar(10) 
SET @platform = ''platform_name'' 

獲得SQL工作

SET @SQL = 
' 

不幸的是「Microsoft SQL Server Report Builder 3.0「無法執行此SQL,因爲它要求獲取變量@SQL的值,即使已定義值。我曾嘗試聲明和設置在同一行@SQL的價值:

DECLARE @SQL varchar(5000) = 'DECLARE @company varchar(10) 

但報表生成器仍要求@SQL和報告的值不:-(

+0

的問題是我的錯。參數名是區分大小寫的,所以確保它在任何地方都讀取'@SQL',最後一條語句將其命名爲「@sql」.SSRS也可能在設計器中添加了'@sql'參數,如果可以的話,您可以安全地刪除。 –

回答

1

來看,這很難說哪些問題是沒有看到你的代碼,但你不能只是換一個字符串中的SQL就像(我覺得)你正在嘗試做的。

要測試你的SQL只是做一些簡單的Management Studio中像

DECLARE @MyParm varchar(256) = 'myColumnName' 
SELECT *, @MyParm FROM myTable 

這將返回MyTable中的所有列,並將字符串值'myColumnName'作爲最後一列。

如果這是你正在嘗試做的事情,那麼你可能需要改變你的SQL來使用動態SQL,就像這樣。

DECLARE @MyParm varchar(256) = 'myCOlumnName' 
DECLARE @SQL varchar(max) 

SET @SQL = 'SELECT *, ' + @MyParm + ' FROM myTable' 

EXEC (@SQL) 

如果我有這個完全錯誤的,請張貼一些示例代碼,以便我們可以看到你正在嘗試。

編輯:這是基於你的示例代碼一個明確的答案

DECLARE @Column sysname = 'Column999' 
DECLARE @SQL varchar(max) 

SET @SQL = 
'SELECT 
    table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 
    ,table_name.column9 ,table_name.column2 ,table_name.column19 
    ,' + @column + 
    ' FROM table_name 
    WHERE table_name.company LIKE @company 
     AND table_name.platform LIKE @platform 
     AND (' + @column + ' is null OR ' + @column + ' = '''' OR ' + @column + ' = ''N/A'' OR ' + @column + ' = ''Unknown'')' 

-- uncomment below to check SQL statement is correct 
--print @sql 

-- exec the SQL statement 
exec (@sql) 

因爲它的立場,這將執行下列SQL

SELECT 
    table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 
    ,table_name.column9 ,table_name.column2 ,table_name.column19 
    ,Column999 FROM table_name 
    WHERE table_name.company LIKE @company 
     AND table_name.platform LIKE @platform 
     AND (Column999 is null OR Column999 = '' OR Column999 = 'N/A' OR Column999 = 'Unknown') 
+0

謝謝您的回覆這是我想做的事:'選擇 table_name.column1 ,table_name.column21 ,table_name.column15 ,table_name.column6 ,table_name.column9 ,table_name.column2 , table_name.column19 ,@ column - 此變量中的值是表table_name中的現有列名稱 FROM table_name WHERE table_name.company LIKE @company AND table_name.platform LIKE @platform AND(@column爲null OR @column =''OR @column ='N/A'OR @column ='Unknown'); - 我想在這裏也使用相同的變量' – 300

+0

我編輯了我的答案以匹配您的具體示例 –

+0

很抱歉再次打擾您,但我如何聲明並設置@company和@platform?在'DECLARE @Column sysname ='Column999''這一行之後,我嘗試了'DECLARE @company varchar(10)='company_name''和'DECLARE @platform varchar(10)='platform_name'',但查詢失敗並顯示錯誤:必須聲明標量變量「@company」。我嘗試在單獨的行上聲明並設置,但仍然出現相同的錯誤。 – 300

相關問題