2017-04-06 63 views
1

我正在嘗試編寫一個SP,它使用存儲過程中的子字符串函數,並使用列名作爲輸入。然而,當我運行在存儲過程中使用內置int函數的sql server

exec sp_addCountySchoolDistrict N'table', N'districtCountySchoolCode' 

它使用'districtCountySchoolCode'爲子,而不是從該行的值...

例如

create table [dbo].[test] (districtCountySchoolCode nvarchar(100)) 
insert into dbo.test values ('1234567891234') 
go 

CREATE PROCEDURE sp_addCountySchoolDistrict 
    @tableName nvarchar(100), 
    @colName nvarchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @Sql NVARCHAR(MAX); 



SET @Sql= N'alter table ' + replace(replace(quotename(@tableName),']',''),'[','') + 
       N' add countyCode as ''' + substring(@colName, 1,2) + N', 
         districtCode as ''' + substring(@colName, 3,5) + N', 
         schoolCode as ''' + substring(@colName, 8,7) + N';' 
    select @sql; 

    EXECUTE sp_executesql @Sql 
END 
GO 
exec sp_addCountySchoolDistrict N'[dbo].[test]', N'districtCountySchoolCode' 

select * from test_copy 

Coder Wall

+0

我不確定我是否理解你的問題.... – Kostis

+0

當我運行SP時,它使用@colName而不是'1234567891234'的'districtCountySchoolCode' 實際查詢應該是'alter table [dbo]。爲試圖提供[測試] \t添加countycode作爲子字符串(districtCountySchoolCode,1,2), \t districtCode作爲子字符串(districtCountySchoolCode,3,5), \t schoolCode作爲子字符串(districtCountySchoolCode,8,7)' – spitfiredd

+0

加1一個示例演示 – TheGameiswar

回答

1

把字符串中動態sql的文字部分,如下所示:

N' add countyCode as substring(''' + @colName+ N', 1,2) , 
+0

這工作了一點點調整: 'N'alter表'+替換(替換(quotename(@tableName),']',''),'[','')+ N '添加countyCode作爲子串(' + @colName + N '1,2), districtCode作爲子串(' + @colName + N '3,5), \t \t \t \t schoolCode作爲子串(' + @colName + N',8,7);''做了訣竅 – spitfiredd

0

試試這個

exec sp_addCountySchoolDistrict N'[dbo].[test]', N'1234567891234' 
0

你的錯誤是,你通過「列名」作爲一個字符串,但你的代碼無處選擇從測試表中指定列的值。您必須首先執行select語句,以獲取該值,然後在其餘代碼中使用該值。

這應該工作

create table [dbo].[test] (districtCountySchoolCode nvarchar(100)) 
insert into dbo.test values ('1234567891234') 
go 

CREATE PROCEDURE sp_addCountySchoolDistrict 
    @tableName nvarchar(100), 
    @colName nvarchar(100) 
AS 
BEGIN 
    declare @val nvarchar(100); 
    declare @initialQuery nvarchar(100); 

    SET NOCOUNT ON; 
    DECLARE @Sql NVARCHAR(MAX); 

SET @initialQuery = 'SELECT @value=' + quotename(@colName) + ' FROM ' + replace(replace(quotename(@tableName),']',''),'[','') 
EXECUTE sp_executesql @initialQuery, N'@value nvarchar(100) OUTPUT', @[email protected] OUTPUT 

SET @Sql= N'alter table ' + replace(replace(quotename(@tableName),']',''),'[','') + 
       N' add countyCode as ''' + substring(@val, 1,2) + N''', 
         districtCode as ''' + substring(@val, 3,5) + N''', 
         schoolCode as ''' + substring(@val, 8,7) + N''';' 
    select @sql; 

    EXECUTE sp_executesql @Sql 
END 
GO 
exec sp_addCountySchoolDistrict N'[dbo].[test]', N'districtCountySchoolCode' 

select * from test 

但是你必須添加一個WHERE條件,如果你有test表中有多個值,我想。