MS sql 查詢動態表名的方法

来源:http://www.cnblogs.com/Jeff-Lai/archive/2017/08/24/7421705.html
-Advertisement-
Play Games

ALTER PROCEDURE [dbo].[sp_GetClassCountData] @BatchId NVARCHAR(50), @ExamId VARCHAR(100), @ClassId VARCHAR(100), @SubjectId NVARCHAR(50)ASBEGIN DECLAR ...


ALTER PROCEDURE [dbo].[sp_GetClassCountData]
@BatchId NVARCHAR(50),
@ExamId VARCHAR(100),
@ClassId VARCHAR(100),
@SubjectId NVARCHAR(50)
AS
BEGIN
DECLARE @TableName NVARCHAR(100),
@yxStartScore decimal(18,2),
@yxEndScore decimal(18,2),
@yxNum varchar(50),
@jgStartScore decimal(18,2),
@jgEndScore decimal(18,2),
@jgNum varchar(50)

SET @TableName='[Z_Exam_Subject_Count_'+@ExamId + ']';

select @yxStartScore=LineStart,@yxEndScore=LineEnd from AcademicGrade where LineLevel='A';
select @jgStartScore=LineStart,@jgEndScore=LineEnd from AcademicGrade where LineLevel='C';

 


--獲得優秀人數
DECLARE @str2 NVARCHAR(MAX)='select @Nums= count(*) from '+@TableName+' where BatchId=@BatchId and ExamId=@ExamId and ClassId=@ClassId and SubjectId=@SubjectId and TotalScore >=@yxStartScore and TotalScore<=@yxEndScore'

PRINT(@str2)

exec SP_EXECUTESQL @str2,N'@Nums INT OUT,@BatchId NVARCHAR(50), @ExamId VARCHAR(100),@ClassId VARCHAR(100), @SubjectId NVARCHAR(50),
@yxStartScore decimal(18,2),@yxEndScore decimal(18,2)',@yxNum OUTPUT,@BatchId,@ExamId,@ClassId,@SubjectId,@yxStartScore,@yxEndScore

 

--N'@Nums INT OUT,@BatchId NVARCHAR(50), @ExamId VARCHAR(100),@ClassId VARCHAR(100), @SubjectId NVARCHAR(50),
@yxStartScore decimal(18,2),@yxEndScore decimal(18,2)    這些參數是查詢所需參數,查詢條件少的可以減少數量,@Nums INT OUT是返回值


--獲得及格人數
DECLARE @str3 NVARCHAR(MAX)='select @Nums= count(*) from '+@TableName+' where BatchId=@BatchId and ExamId=@ExamId and ClassId=@ClassId and SubjectId=@SubjectId and TotalScore >=@jgStartScore and TotalScore<@jgEndScore'

PRINT(@str3)

 

 

exec SP_EXECUTESQL @str3,N'@Nums INT OUT,@BatchId NVARCHAR(50), @ExamId VARCHAR(100),@ClassId VARCHAR(100), @SubjectId NVARCHAR(50),
@jgStartScore decimal(18,2),@jgEndScore decimal(18,2)',@jgNum OUTPUT,@BatchId,@ExamId,@ClassId,@SubjectId,@jgStartScore,@jgEndScore

DECLARE @str NVARCHAR(MAX)='select count(*) as tatolNum,AVG(TotalScore) as avgs,max(TotalScore) as maxs,min(TotalScore) as mins,
case
when COUNT(*)=0 then ''0%''
else CONVERT(varchar(100), Round(convert(float,'+@yxNum+')/convert(float,COUNT(*))*100,2))+''%''    --兩個數相除四捨五入保存兩們小數後再添加百分號
end as yxl,
case
when COUNT(*)=0 then ''0%''
else CONVERT(varchar(100), Round(convert(float,'+@jgNum+')/convert(float,COUNT(*))*100,2))+''%''
end as jgl
from '+@TableName+' where BatchId='''+@BatchId+''' and ExamId='''+@ExamId+''' and ClassId='''+@ClassId+''' and SubjectId='''+@SubjectId+''''

PRINT(@str)

EXEC(@str)

END

 

-----------------------------------詳細說明----------------------------------------

 

 EXEC 執行拼接sql語句的時候不支持 嵌入式參數,如下:

DECLARE @OUT_Nums INT,@IN_Score INT,@Sql NVARCHAR(MAX)
SET @IN_Score = 90
SET @sql = 'SELECT @Nums=COUNT(1) FROM t_student WHERE Score >= @Score'
EXEC (@sql)

通過上面的代碼發現,EXEC 執行拼接的SQL語句的時候,不支持內嵌參數,包括輸入參數和輸出參數。有的時候我們想把得到的count(*)傳出來,用EXEC是不好辦到的。接下來,再來看看SP_EXECUTESQL的使用:

二、SP_EXECUTESQL:

SP_EXECUTESQL 是在 SQL 2005中引入的新的系統存儲過程,也是用來處理動態SQL 語句的。它比EXEC 更加靈活

SP_EXECUTESQL 支持內嵌參數:

先來看一下SP_EXECUTESQL的語法:

sp_executesql [ @stmt = ] stmt
[ 
    {, [@params=] N'@parameter_name data_type [ OUT | OUTPUT ][,...n]' } 
     {, [ @param1 = ] 'value1' [ ,...n ] }
]

說明:
[ @stmt = ] stmt 包含 Transact-SQL 語句或批處理的 Unicode 字元串。stmt 必須是 Unicode 常量或 Unicode 變數。不允許使用更複雜的 Unicode 表達式(例如使用 + 運算符連接兩個字元串)。不允許使用字元常量。如果指定了 Unicode 常量,則必須使用 N 作為首碼。例如,Unicode 常量 N'sp_who' 是有效的,但是字元常量 'sp_who' 則無效。字元串的大小僅受可用資料庫伺服器記憶體限制。在 64 位伺服器中,字元串大小限製為 2 GB,即 nvarchar(max) 的最大大小。stmt 中包含的每個參數在 @params 參數定義列表和參數值列表中均必須有對應項

[ @params = ] N'@parameter_namedata_type[ ,... n ] ' 包含 stmt 中嵌入的所有參數定義的字元串。字元串必須是 Unicode 常量或 Unicode 變數。每個參數定義由參數名稱和數據類型組成。n 是表示附加參數定義的占位符。在 stmt 中指定的每個參數必須在 @params 中定義。如果 stmt 中的 Transact-SQL 語句或批處理不包含參數,則不需要 @params。該參數的預設值為 NULL。

[ @param1 = ] 'value1'

參數字元串中定義的第一個參數的值。該值可以是 Unicode 常量,也可以是 Unicode 變數。必須為 stmt 中包含的每個參數提供參數值。如果 stmt 中的 Transact-SQL 語句或批處理沒有參數,則不需要這些值。

[ OUT | OUTPUT ]

指示參數是輸出參數。除非是公共語言運行 (CLR) 過程,否則 textntext 和 image 參數均可用作 OUTPUT 參數。使用 OUTPUT 關鍵字的輸出參數可以為游標占位符,CLR 過程除外。

n 附加參數值的占位符。這些值只能為常量或變數,不能是很複雜的表達式(例如函數)或使用運算符生成的表達式。

返回代碼值 : 

0(成功)或非零(失敗)

 

 

 

 

 

 

 

結果集:從生成 SQL 字元串的所有 SQL 語句返回結果集

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 用dba用戶登錄plsql,執行 第一步,建立表空間 CREATE SMALLFILE TABLESPACE "ASSETS" LOGGING DATAFILE 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\SDZC0216\ASSETS1.ora' SIZE 500M AUT ...
  • 由於防火牆問題,TCP keep alive 問題,以及 MySQL 自身的參數問題這三個在使用中比較常見,所以今天就分享下自己找到的排查方法。 今天先聊一聊防火牆問題 大多數人在第一次創建 MySQL database on Azure 實例之後便開始嘗試連接。但是往往遇到的結果不是連接成功而是如 ...
  • 用 insert 添加用戶時,可能會報錯: ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value my-default.ini中有一條語句: sql_mode=NO_ENGINE_SUBSTITUTION,STRICT ...
  • 一、搭建Mongodb 副本集 副本集中有三個角色: 主節點:所有副節點的數據均來自於主節點,並且只能對主節點進行讀寫操作。副節點:數據來自於主節點,可以進行讀取操作,但是不能進行寫操作。仲裁者:不含數據也不與客戶端交流,只在選舉主節點的時候進行投票。 Mongodb最多支持50個副本集成員以及最多 ...
  • 業務場景: 某天truncate大量表時遇到錯誤ORA-O2266:表中的唯一/主鍵被啟用的外鍵引用,不想看ER圖來禁用大量複雜約束,所以研發了三種套路... 一. 最偷懶套路 如果要一次性導出很多表, 懶得看ER圖, 可以用巧辦法: PLSQL developer: Tools Export ta ...
  • select * from 表名 as of timestamp to_timestamp('2016-02-23 23:59:59','yyyy-mm-dd hh24:mi:ss') ; 該語句表示查詢某一個時間點時該表的數據,通過修改時間,你可以查詢刪除之前時的數據。篩選出來重新插入即可。 ...
  • 在MySQL中如何給普通用戶授予查看所有用戶線程/連接的許可權,當然,預設情況下show processlist是可以查看當前用戶的線程/連接的。 mysql> grant process on MyDB.* to test; ERROR 1221 (HY000): Incorrect usage o... ...
  • 具體報錯如下: Table '.\mysql\proc' is marked as crashed and should be repaired 我的解決辦法: 找到mysql的安裝目錄的bin/myisamchk工具,右擊【以管理員身份運行】修複下即可。 網上解決辦法: 找到mysql的安裝目錄的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...