2015-05-19 110 views

回答

0

解決此問題的一種方法是創建一個用戶定義表類型來包含名字,然後將該表傳遞給標量值函數。

CREATE TYPE FirstNames AS TABLE (firstName varchar(50), RandomSeed varchar(128)) 
GO 

DECLARE @myFirstNames as FirstNames 
INSERT INTO @myFirstNames 
    SELECT 'Bill', NEWID() 
    UNION SELECT 'Steve', NEWID() 
    UNION SELECT 'Jack', NEWID() 

SELECT * FROM @myFirstNames 

接下來,創建一個將您的新表類型作爲參數的標量值函數。

CREATE FUNCTION RandomFirstName(@TableName dbo.FirstNames READONLY) 
RETURNS VARCHAR(50) 
AS 
BEGIN 
    DECLARE @name VARCHAR(50) 

    SELECT TOP 1 @name = a.firstName 
    FROM @TableName a 
    ORDER BY a.RandomSeed 

    RETURN @name 
END 

最後,調用你的函數,像這樣:

SELECT [dbo].[RandomFirstName] (@myFirstNames) 
0

你可以嘗試這樣的事情:

CREATE TABLE Contacts(id INT IDENTITY, name varchar(10)) 
GO 

INSERT INTO dbo.Contacts VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10) 
GO 

CREATE VIEW vNames AS 
SELECT * FROM (VALUES('Bill', NEWID()),('Steve',NEWID()),('Jack',NEWID())) Names(name, g) 
GO 

CREATE FUNCTION RandomFrom() 
RETURNS VARCHAR(10) 
AS 
BEGIN 
    DECLARE @name VARCHAR(10) 

    SELECT TOP 1 @name = name 
    FROM dbo.vNames 
    ORDER BY g 

    RETURN @name 
END 
GO 

UPDATE dbo.Contacts SET name = dbo.RandomFrom() 

SELECT * FROM dbo.Contacts 

輸出:

id name 
1 Bill 
2 Jack 
3 Jack 
4 Bill 
5 Steve 
6 Steve 
7 Steve 
8 Jack 
9 Bill 
10 Bill 
+0

謝謝,我能做到這一點在一杆?即通過以起作用以從中選擇的值。每次運行函數時,我都會選擇值。 – Bill

+0

你看到jax的答案了嗎? –

+0

是的,我做到了。我所需要的是能夠勝任的選擇RandomFrom('Bill','Steve','Jack','John'),而不必創建類型或表格。 – Bill